3 svar
106 visningar
Na5a 388
Postad: 17 maj 2022 22:08

Error input pekare

Jag har skrivit den här koden för Gauss elimination

#include <stdio.h>

void eliminate (double **A, int N){
    int i,j,k;
    for (k = 0; k < N; k++) {
        for (j = k +1; j <N; j++ ){
            printf("%.2f\n", A[k][k]);
            printf("%.2f\n", A[k][j]);
            A[k][j] = A[k][j] / A[k][k];
            printf("%.2f\n", A[k][j]);
        }
        A[k][k] = 1.0;
        printf("%.2f\n", A[k][k]);
        
        for(i = k+1; i<N; i++){
            for(j = k+1; j<N; j++){
                printf("%.2f\n", A[i][j]);
                printf("%.2f\n", A[i][k]);
                printf("%.2f\n", A[k][j]);
                A[i][j] = A[i][j] - A[i][k] * A[k][j];
                printf("%.2f\n", A[i][j]);
            }
            A[i][k] = 0.0;
            printf("%.2f\n", A[i][k]);
        }
        /* code */
    }
}
    
}

int main(){
    
double **matrix [4][4] = { {57, 20, 34, 59}, {104, 19, 77, 25}, {55,14,10,43},{31,41,108,59}
};

int N = 4;
eliminate(matrix, N)
    
}

men jag får error medelandet "main.c: In function ‘main’: main.c:42:29: warning: initialization of ‘double **’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]"

Jag är ny till pekare så jag förstår inte riktigt hur jag ska fixa det här, kan jag få ett tips i rätt riktning?

CurtJ 1149
Postad: 18 maj 2022 09:43 Redigerad: 18 maj 2022 09:49

Nu är det några år sen jag höll på med c men du har deklarerat en (indirekt pekare) till en double men du initierar den med heltal. Prova med att ange initieringen med flyttal i stället.. ändra 57 till 57. osv. Jag tror det rättar till ditt problem men är långt ifrån säker. Återkom om det inte gör det.

Fundersam på att du deklarerar matrix som en **. Det betyder om jag kommer ihåg rätt en pekare till en pekare. Prova med en asterisk om ovanstående inte fungerar.

Laguna Online 28582
Postad: 18 maj 2022 16:49

Heltal är inget problem, de kommer att göras om till flyttal.

Däremot är deklarationen fel: matrix initieras till en 4*4-matris, och är varken en direkt eller indirekt pekare. Om du tar bort ** så fungerar deklarationen.

Men det här är inte den datastruktur som funktionen eliminate vill ha. Den vill ha en pekare till pekare. När du skickar matrix som argument så görs den om till en pekare till matrisen, men det är en double[4][], inte en double**.

Du skulle behöva initiera matrix så här:

double a1[] = {57,20,34,59};

double a2[] = {104,19,77,25};

double *matrix[] = {a1, a2};

Står det i uppgiften hur du ska göra?


Tillägg: 18 maj 2022 16:51

Det verkar gå att göra så här i C99:

double *matrix[] = {{57,20,34,59},{104,19,77,25}};

och det är ju bra i så fall. Jag kan inte testa det just nu.

 

Laguna Online 28582
Postad: 20 maj 2022 11:15

Nu har jag provat lite, och det verkar inte vara precis som jag trodde, även om det var delvis rätt. Någon kanske vet hur man skriver för att initiera matrisen med anonyma double-arrayer.


Tillägg: 20 maj 2022 11:24

Typ så här kan man skriva. Man måste ha med typ-casten, verkar det som:

double *matrix[] = {(double[]){5,6,7}, (double[]){8,7,6}};

 

Svara Avbryt
Close