2016-03-20 31 views
1
burada

benim kodudur: (şamandıra' geçenİşaretçi ile bir diziyi nasıl bir işleve iletebilirim?

  1. uyumsuz işaretçi türleri: i terminalde kodu çalıştırmak çalıştığımızda

    #include <stdio.h> 
    
    #include <stdlib.h> 
    
    
    void AverageOfAss(float marks[][101], int numStudents, int numAss, float *avg[]) { 
        int i, j; 
        for (j=0; j<numAss; j++) {  
         *avg[j] = 0; 
         for (i=0; i<numStudents; i++) { 
          *avg[j] += marks[i][j]; 
          *avg[j] = *avg[j]/(float)numStudents*100; 
          return ; 
         } 
        } 
    } 
    
    void PrintAvg(float *avg[], int numAss) { 
        int i; 
        for (i=0; i<numAss; i++) { 
         printf("Average for Exam %d = %.1f\n", i, *avg[i]); 
    
         return; 
        } 
    } 
    
    int main(int argc, char* argv[]) { 
        float grades[1001][101], avgAss[1001]; 
        float *p; 
        int i, j, row, col; 
    
        p = avgAss; 
    
        row = atoi(argv[1]); 
        col = atoi(argv[2]); 
    
        FILE *input_grades; 
    
        input_grades = fopen("grades.txt", "r"); 
    
        // READ IN GRADES 
        for (i=0; i<row; i++) { 
         for (j=0; j<col; j++) { 
          fscanf(input_grades, "%f, ", &grades[i][j]); 
         } 
        } 
    
        // OUTPUT GRADES LIST 
        printf("==================================\n"); 
        printf("Student grades from the input file\n"); 
        printf("==================================\n"); 
        for (i=0; i<row; i++) { 
         printf("\n"); 
          for (j=0; j<col; j++) { 
           printf("%.1f, ", grades[i][j]); 
          } 
        } 
        printf("\n\n"); 
        AverageOfAss(grades, row, col, &avgAss); 
        PrintAvg(&avgAss, col); 
    
        fclose(input_grades); 
    } 
    

    Her şey olması dışında yolunda, bazı uyarılarda gösterdi *): [1001]' türündeki parametre float **'

    AverageOfAss (sınıflarda, satır, sütun, & avgAss);

  2. argüman geçen burada 'ort'

    void AverageOfAss {

  3. uyumlu ([], [101] numStudents, numAss int * ort [] yüzer int işaretleri float) parametre Çeşidi parametre 'şamandıra (*): [1001] 'şamandıra **'

    PrintAvg (& avgAss, sütun) geçen işaretçi türleri;

  4. argüman geçirerek burada 'ort' parametresine

    geçersiz PrintAvg (şamandıra * ort [], int numAss) {

kimse benim kodları ne biliyor mu? Ve bunu nasıl düzeltmeliyim? (newbie here)

+0

İlgili olmayan *, * aramaların her iki ucundaki parametre türlerini düzelttikten sonra bile ortalamaları doğru olarak hesaplayamaz. Ve hem döngü için hesaplama hem de for döngüsü için raporlama, döngülerin gövdesine gömülüdür. Onları sadece bir kez yinelemeyi, sonra arayan kişiye geri dönmesini istediğinden şüpheliyim. – WhozCraig

+0

tam olarak şu anda karşı karşıya olduğum gibi, kod çalışır gibi, ancak hesapladığı ortalama yanlış ve numaranın nasıl olduğunu bilmiyorum. Kodlarımdaki sorunun ne olduğunu biliyor musun? – user6089062

cevap

2

Sorun, float dizisine bir göstericinin, bir işaretçiye float işaretçisiyle aynı olmamasıdır.

hata mesajı aslında sorunu çözmek gerekir tam olarak nasıl anlatır ... Ne derleyici anlatıyor sizin argüman türü float ** ait iken &avgAss tip float(*)[1001] ait olmasıdır. Yani, fonksiyon argüman türünüzü, derleyicinin beklediği gibi uydurmak için değiştirmelisiniz, ör. float (*avg)[1001]. O zaman, *avg[j]'un aslında *(avg[j]) anlamına geldiği ve (*avg)[j] neye ihtiyacınız olduğuyla ilgili bir sorununuz vardır.

Ancak sen hiç diziye gösterici geçmesine gerek yoktur. İhtiyacınız olan tek şey, dizinin ilk elemanına bir göstericiye doğal olarak zarar vermesini sağlamaktır, bu yüzden gerçekten yapmanız gereken fonksiyon argümanını float *avg olarak değiştirmek ve normal bir dizi avg[j] gibi kullanmaktır. Ve elbette diziye bir işaretçi göstermeyin, çağrıda yalnızca avgAss kullanın.

0

Bir diziyi bir işleve argüman olarak iletmek isterseniz, bu işlevin dizisinin içeriğini değiştirin ve değiştirilmiş diziyi saklayın, diziye bir işaretçiyi göstermeye gerek yoktur. diziye işaretçi (yani, [] veya & işleçleri olmayan dizinin adı). C'de, temel türlerin verileri kopyalama yoluyla işlevlere geçirilir, böylece değişiklikleri korumak için işaretçilere geçiş yapmanız gerekir. Diziler kopya ile geçirilemez ve bir düzey indirme yeterlidir.

İlgili konular