2016-03-23 5 views
-2

Hier ist mein Code. Die Anweisung int Wert = atoi (ptr [index]) in der Funktion findMin() gibt einen Fehler wie im Screenshot gezeigt.c atoi() Funktion funktioniert nicht

enter image description here

Das Merkwürdige ist, dass, wenn ich die gleiche atoi() Funktion in Haupt verwenden, alles ziemlich gut funktioniert, aber es schreit in findMin!

CODE: 
void* findMin(void *param); 

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

    pthread_t t2; //for min 
    num=argc; 

    /*int index=1; THIS WORKS 
    int value=atoi(argv[index]);*/ 

    //creating worker thread 
    pthread_create(&t1,NULL,findMin,argv); 

    pthread_join(t2,NULL); //wait for min 
    printf("The minimum value is %d\n",min); 


    return 0; 
} 

void* findMin(void *param) 
{ 
    char *ptr=(char *) param; //casting 
    int index=1; 
    min=ptr[1]; 
    for(index; index<num; index++) 
    { 
     int value=atoi(ptr[index]); //THIS SCREAMS LIKE HELL! 
     if(comp<min) min=value; 

    } 
} 
+1

Sie brauchen atoi (ptr) oder atoi (ptr + index); – Claris

+0

@Claris, ich denke, OP versucht, einzelne Zeichen in Ganzzahlen zu konvertieren, 'ptr + index' wird den Rest der Zeichenfolge konvertieren –

+3

Veröffentlichen Sie keine Bilder von Text! – Olaf

Antwort

3

Blick auf die Unterschrift von atoi:

int atoi(const char *); 

Die Funktion erwartet das Argument char * des Typs zu sein. Sie übergeben ptr[index], die vom Typ char ist.
würde die einfache Lösung, die eine lokale Variable zu verwenden sein:

char digit[2] = ""; 

und legen Sie dann das erste Zeichen auf den Wert, den Sie bearbeiten möchten:

digit[0] = ptr[index]; 
int value = atoi(digit); 

weil digit des Typs char[] ist, es wird in einen Zeiger zerfallen, wenn es an die Funktion übergeben wird


Aber das wäre chaotisch. Es gibt einen einfacheren Weg. Der C-Standard erfordert numerische Zeichen sequentiell zu sein, also ein gemeinsamer Trick numerische Zeichen, um ihre ganzzahlige Werte zu konvertieren ist, dies zu schreiben:

int value = ptr[index] - '0'; 

Das funktioniert, weil in ASCII beispielsweise der numerischen Wert von '0' 48 , '1' ist 49, 2 ist 50 und so weiter. wenn Sie eine Zeichenfolge wie folgt Deshalb haben:

"1234" 

und Sie iterieren jedes Zeichen, Subtraktion '0' von jedem, erhalten Sie:

49 - 48 = 1 
50 - 48 = 2 
51 - 48 = 3 
52 - 48 = 4 

Im Grunde tun, was Sie wollen/müssen


Hang auf

ich habe gerade bemerkt, bist du eigentlich über 01.234.249 Iterieren. Ihre Besetzung ist falsch!

char *ptr=(char *) param; 

Sollte tatsächlich:

char **ptr = param; 

Da argv ist ein char ** (Zeiger auf Zeiger).

Sie tun auch einige seltsame Dinge hier:

Wenn Sie, was wirklich zu tun versuchen, ist, alle Argumente zu vergleichen, die übergeben wurden und die niedrigste Zahl von ihnen zu holen, dann ist das, was sollte man schreiben:

char **ptr= param; //no need for cast, void * is compatible with char ** 
int i = 1; 
min = atoi(ptr[1]);//assuming min is int, because you're assigning value to it later on 
for(i; i<num; ++i) 
{ 
    int value = atoi(ptr[i]); 
    if(value < min)//replaced comp with value, because I can't see the comp variable anywhere 
     min = value; 
} 
+0

@chux: In Anführungszeichen geändert, ich erwähne _ "Der C-Standard erfordert numerische Zeichen, um sequentiell zu sein" _, und ich gehe dann fort, die ASCII-Werte als ein Beispiel zu verwenden. Keine Notwendigkeit, das OP mit Informationen über verschiedene Zeichensätze wie EBCDIC zu bombardieren :) –