2016-03-23 30 views
-2

İşte benim kodum. FindMin() işlevindeki int value = atoi (ptr [index]) ifadesi, ekran görüntüsünde gösterildiği gibi bir hata verir.c atoi() işlevi çalışmıyor

enter image description here

garip şey ana aynı atoi() işlevi kullandığınızda, her şey oldukça iyi çalışıyor ama findMin bağırır olmasıdır! atoi imzasıyla birlikte

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

atoi (ptr) veya atoi (ptr + index); – Claris

+0

@Claris, OP'nin tekli karakterleri tamsayıya dönüştürmeye çalıştığını düşünüyorum, 'ptr + index' dizginin kalanını çevirecek –

+3

Metin görüntülerini yayınlama! – Olaf

cevap

3

Görünüş:

int atoi(const char *); 

fonksiyon argümanı tip char * arasında olmasını bekler. char türünde olan ptr[index]'u geçiyorsunuz. o digit tip char[] taşımaktadır

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

çünkü:
basit bir çözüm yerel bir değişken kullanmak olacaktır:

char digit[2] = ""; 

Sonra işlemek istediğiniz değere ilk karakteri ayarlayın

İşlevine iletilirken bir işaretçiye dönüşecektir. Ancak bu karışıklık olacaktır. Daha kolay bir yol var. Bu işleri

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

örneğin ASCII, '0' sayısal değeri 48'dir, çünkü: Ortak bir hüner onların tamsayı değerlerine sayısal karakterler dönüştürmek için böylece C standart bu yazma, sıralı olarak sayısal karakterler olduğunu gerektirir '1' 49, 2 50'dir ve böyle devam eder. Eğer böyle bir dize varsa, bu nedenle:

"1234" 

ve her birinden '0' çıkararak, her karakter yineleme elde edersiniz:

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

Temelde istediğini/ihtiyacını

yapıyor

üzerinde


asın sadece aslındaüzerinden yineleme fark ettik. dökümünüz yanlış!
char *ptr=(char *) param; 

aslında olmalı: argv bir char ** (pointer pointer) 'dir

char **ptr = param; 

çünkü.

Ayrıca buradan bazı garip şeyler yapıyoruz:

ne gerçekte geçirildi tüm argümanları karşılaştırmak ve onlardan en düşük sayıyı almak olduğunu yapmaya çalışıyoruz, o zaman bu yazman gereken buysa

:

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: Çift tırnak olarak değiştirildi, "C standardı sıralı sayısal karakterler gerektirir" _, ve sonra ASCII değerlerini örnek olarak kullanmaya devam ediyorum. EBCDIC gibi çeşitli karakter kümeleri hakkında bilgi içeren OP'yi bombalamaya gerek yok :) –