Uforenlig pekertypefeil [C]

stemmer
1

Jeg blir stadig fortalt at i denne linjen med kode passerer argument fra uforenlige pekeren type.
Her er linjen med kode:

if (linear_search (size_of_A, argv[i]))  

Hva betyr dette og hvordan kan jeg fikse det? Her er hele programmet:

int linear_search ( int size_of_A, char*argv[]){  
   int i;  
   i = 2;  
   while (i <= size_of_A - 1){  
      if (!strcmp (argv [1], argv[i])){  
      return 1;  
      }  
   }  
   return 0;  
}  

int main (int argc, char*argv []){  
   int size_of_A = argc - 2;  
   int i = 2;  
      if (linear_search (size_of_A, argv)){  
         printf (%s not found\n, argv [1]);  
         return 1;  
      } else{  
         printf (%s found\n, argv[1]);  
         return 0;  
      }  
      i = i + 1;  
   }  
}   

Ok, det løser advarsel, men nå når jeg kjører programmet gjennom kompilatoren ingenting skjer. Det er ment for å fortelle meg om det første argumentet gjentas eller ikke.
For eksempel produksjonen vil se slik ut:

./a 3 hso 8 3  
3 found 
Publisert på 15/04/2009 klokken 05:21
kilden bruker
På andre språk...                            


10 svar

stemmer
1

Du passerer en parameter (den andre) til den linear_searchfunksjon som ikke samsvarer med den forventede typen av argumentet. argv [I] har den type char *, som vanligvis refereres til som en streng, mens den linear_searchfunksjon regner char * [], som er en tabell av strenger.

Svarte 15/04/2009 kl. 05:25
kilden bruker

stemmer
4

linear_search forventer en datatype " char **". Du passerer i argv[i], som ligger bare en char*. Prøv passerer "argv" som dette:

if (linear_search(size_of_A, argv))
Svarte 15/04/2009 kl. 05:25
kilden bruker

stemmer
0

Din funksjon forventer en char*[](som skal være tilsvarende i denne saken char**). Men ved å kalle det med

linear_search (size_of_A, argv[i])

du nettopp passert en char*som argument (siden [i]dereferences en peker). Fra det jeg ser i koden din kan du prøve å bruke

linear_search (size_of_A, argv+i)

men jeg er ikke helt sikker på om det vil gi den tiltenkte atferden. Fortsatt for tidlig å forstå C :)

Svarte 15/04/2009 kl. 05:26
kilden bruker

stemmer
0

Jeg vet ikke logikken i programmet, men kompilatoren feilen er løst. Se dette:

int main (int argc, char * argv []) {

int size_of_A = argc - 2;  
int i = 2;  
if (linear_search (size_of_A, argv[])){  
     printf ("%s not found\n", argv [1]);  
     return 1;  
} 
Svarte 15/04/2009 kl. 05:28
kilden bruker

stemmer
0
int linear_search ( int size_of_A, char*argv[]){ 

char*argv[]betyr "-pekeren til en oppstilling av char"; som et funksjonskall parameter, som er den samme som char**.

argv er en char**, men argv[i]er en char*, fordi C definerer argv[i]som *(argv + i )eller, i engelsk "deferanseoperasjon (argv plus i)". Dereferencing et char**etterlater deg med en char*, og at "er ikke det linear_searcher erklært å ta.

Ta en titt her hvis du fortsatt forvirret.
`

Svarte 15/04/2009 kl. 05:31
kilden bruker

stemmer
0

Din linear_search () aksepterer en "rekke strenger" (peker til rekke tegn), mens du passerer det en "streng" (argv [i]). Hva du ønsker å gjøre tror jeg er å ringe linear_search som:

if (linear_search (size_of_A, (argv + i)))

Selv om jeg ikke helt forstår logikken i programmet ... Prøver du å søke argv [1] i de senere argumentene ...?

Svarte 15/04/2009 kl. 05:33
kilden bruker

stemmer
2

Du har en logisk feil i linear_search. Du har en stund loop basert på verdien av i, men ialdri endres. Du mangler kanskje en i++;instruksjon.

Også (selv om dette ikke vil endre programmets oppførsel): variabelen ii mainer aldri brukt. Du kan fjerne det og i = i + 1;instruksjon.

Svarte 15/04/2009 kl. 05:41
kilden bruker

stemmer
1

Din lineær søkefunksjonen sammen bare argv [1] med argv [2] som jeg aldri økes. En mulig løsning (ved hjelp av en for løkke i stedet for en stund, noe som er mer vanlig) ville være:

int linear_search ( int size_of_A, char*argv[]){  
   int i = 0;  // should always initialize in construction
   for ( i = 2; i < size_of_A; ++i ) {
      if (!strcmp (argv [1], argv[i])){  
        return 1;  
      }  
   }  
   return 0;  
}

Variabel jeg blir aldri brukt i hoved, kan du trygt fjerne de to linjene som omhandler det.

Svarte 15/04/2009 kl. 05:46
kilden bruker

stemmer
0

Dette synes å være flott sted å bruke det faktum at argv is NULL-terminated. You don't need to pass the count of items in it, but just do like this:

/* Searches through the NULL-aterminated array for the.
 * given needle string. Returns 1 if found, 0 if not.
*/
int linear_search (char **argv, const char *needle)
{
  int i;

  for(i = 0; argv[i] != NULL; i++)
  {
     if(strcmp(argv[i], needle) == 0)
       return 1;
  }
  return 0;
}

Btw, I recommend comparing the return value of strcmp() nagainst literal 0, rather than using the ! notation, since the return value is in fact not boolean; it returns a int som er uttrykk for forholdet mellom de sammenlignede elementer.

Jeg innser at bruk av! her er vanlig nok til å være nesten idiomatisk, siden mange mennesker tror at C må alltid være så avvisende som mulig, men ... jeg likevel anbefale mot den.

Svarte 15/04/2009 kl. 13:47
kilden bruker

stemmer
0

oldfart: Pass deg for strcmpog alle ubegrensede strengfunksjoner (som strcpy - men vær forsiktig med strncpy: det legger ikke en etterfølgende NULL).

youngun: Men det er ok siden argvhar en haug med NULL avsluttet strenger!

av: Det tankegang fører til en dyktig porsjon buffer overflow. argvble initialisert med nuller. Men det kunne ha endret seg siden da.

y: Men dette er et lite program, og det vil aldri skje.

av: Sure. Programmer vokse og 'aldri' skjer oftere enn du tror.

y: OK, vel Mr. Paranoid, hvilken størrelse bør jeg bruke for grensen på min strncmp? Det er ingen åpenbare tall å bruke! Antyder du jeg finne på noe?

av: Se limits.h, spesielt ARG_MAXog _POSIX_ARG_MAXfor mulige maksimumsverdier. Du kan bruke mindre verdier hvis du ønsker det. Hvis du gjør det, dokumentere det .

y: Så jeg skal skrive strncmp( arg, target, 5000 )? OK, mister paranoid.

av: Ikke gjør det! #define APP_MAX_ARG 5000og deretter bruke strncmp( arg, target, APP_MAX_ARG ). Ikke få meg i gang på magiske tall. Barna i disse dager.

av: Hey, kid, gå av plenen min .

Svarte 15/04/2009 kl. 18:42
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more