Przenoszenie tablicy dwuwymiarowej do funkcji

0

Witam

Wiem ze podobnych tematów było masę, ale nie mogę znaleźć rozwiazania tego problemu

#include <stdio.h>


void wypiszmacierz(int i, int j, int **macierz);
//------------------------------------------------------------------------------------------------
int main()
{
    int a=0,b=0,i,j,z;
    int macierz[i][j];  //macierz
    
    i=3;    //wymiary macierzy
    j=4;    //wymiary macierzy  
    
    
    
    FILE *plik; //deklaracja wskaznika pliku, do wykonywania operacji na pliku
    plik = fopen("dane.txt","r");   //otwarcie wybranego pliku, z okresleniem dostepu do niego
    
    
        while(a<i)  //pętla wierszow
        {
            while(b<j)  //pętla kolumn
            {
            fscanf(plik,"%d",&macierz[a][b]);   //przypisanie wartosci z pliku do danej komorki macierzy
            b++;
            }
        a++;
        b=0;    
        }  
    fclose (plik);  //zamkniecie wczesniej otwartego pliku
    
wypiszmacierz(i,j,macierz);

b=0;
while(b<j)
{
    z=macierz[1][b];
    macierz[1][b]=macierz[2][b];
    macierz[2][b]=z;
    b++;
}

        
    getchar();     
}
//-----------------------------------------------------------------------------------------------
void wypiszmacierz(int i, int j, int **macierz)
{
   printf("\n");
   int a=0,b=0;
    while(a<i)
        {
            while(b<j)
            {
            printf("%d",macierz[a][b]);
            b++;
            }
        printf("\n");
        a++;
        b=0;    
        }
    printf("\n");
}

Chciałbym stworzyć do tego kodu funkcję która będzie wyświetlała dane z macierzy z maina, lecz nie wiem jak przenieść taka macierz do funkcji która to by ja wyświetlała.

tak jak jets teraz mam blad w 33 linii

wypiszmacierz(i,j,macierz);

cannot convert int (*)[((unsigned int)((int)j))]' to int**' for argument 3' to void wypiszmacierz(int, int, int**)'

mam nadzieje ze wykażecie się wyrozumiałością i pomożecie

Podrawiam.

2

Nieznane wymiary tablicy - UB:

    int a=0,b=0,i,j,z;
    int macierz[i][j];  //macierz

Wymiary muszą być znane w momencie definicji tablicy, późniejsza zmiana wartości i i j nie ma wpływu na wielkość tablicy.

Co do samego komunikatu błędu: int **macierz to coś innego niż int macierz[][j]. Pierwsze to tablica wskaźników na wskaźniki/tablice intów. Drugie to dwuwymiarowa tablica. Obrazkowo:

user image

PS: Twoja indentacja jest tragiczna, popracuj nad tym.

0

W treści zadania mam niestety macierz podaną jako A = {aij}, i = 0,1,2;…,n-1; j = 0,1,2;…,m-1
Wiec myślę że niestety muszę do tego wykorzystać mimo wszystko zmienne, nie chce aby się miał do czego nauczyciel doczepić.

Czy da się to jakoś inaczej zrobić niż:

#include <stdio.h>
void wypiszmacierz(int macierz[3][4]);


//------------------------------------------------------------------------------------------------
int main()
{
    int a=0,b=0,i,j,z;
    int macierz[3][4];  //macierz
    i=3;    //wymiary macierzy
    j=4;    //wymiary macierzy  
       
    FILE *plik; //deklaracja wskaznika pliku, do wykonywania operacji na pliku
    plik = fopen("dane.txt","r");   //otwarcie wybranego pliku, z okresleniem dostepu do niego
    
    
    while(a<i)  //pętla wierszow
    {
        while(b<j)  //pętla kolumn
        {
            fscanf(plik,"%d",&macierz[a][b]);   //przypisanie wartosci z pliku do danej komorki macierzy
            b++;
        }
        a++;
        b=0;    
        }
            
    fclose (plik);  //zamkniecie wczesniej otwartego pliku
    
    wypiszmacierz(macierz);

    b=0;
    
    while(b<j)
    {
        z=macierz[1][b];
        macierz[1][b]=macierz[2][b];
        macierz[2][b]=z;
        b++;
    }
        
    wypiszmacierz(macierz);
        
    getchar();     
}


//-----------------------------------------------------------------------------------------------
void wypiszmacierz(int macierz[3][4])
{
   printf("\n");
   int a=0,b=0;
   
   while(a<3)
        {
            while(b<4)
            {
                printf("%d",macierz[a][b]);
                b++;
            }
            
            printf("\n");
            a++;
            b=0;    
        }
        
    printf("\n");
}
1

Zmienne możesz wykorzystywać, tylko ustaw je przed definiowaniem macierzy. Wykonanie programu leci od góry do dołu (o ile nie napotka instrukcji skoku czy pętli). W Twoim kodzie pierw tworzyłeś macierz, potem próbowałeś zmienić wymiary według których była tworzona, co jest oczywistą bzdurą.

Nie wiem czy "inaczej" odnosi się do zahardkodowania wielkości macierzy, czy typu przyjmowanego przez funkcję. Jeśli pierwsze: patrz wyżej. Jeśli drugie: możesz zamiast tablicy dwuwymiarowej użyć tablicy tablic (tak jak na przykładzie z obrazka) i w funkcji przyjąć int**.

0

Chymmm po zmianie oto takiej:

#include <stdio.h>


void wypiszmacierz(int i, int j, int macierz);


//------------------------------------------------------------------------------------------------
int main()
{
    int a=0,b=0,i,j,z;
    i=3;    //wymiary macierzy
    j=4;    //wymiary macierzy
    int macierz[i][j];  //macierz
     
       
    FILE *plik; //deklaracja wskaznika pliku, do wykonywania operacji na pliku
    plik = fopen("dane.txt","r");   //otwarcie wybranego pliku, z okresleniem dostepu do niego
    
    
    while(a<i)  //pętla wierszow
    {
        while(b<j)  //pętla kolumn
        {
            fscanf(plik,"%d",&macierz[a][b]);   //przypisanie wartosci z pliku do danej komorki macierzy
            b++;
        }
        a++;
        b=0;    
        }
            
    fclose (plik);  //zamkniecie wczesniej otwartego pliku
    
    wypiszmacierz(i, j, macierz);

    b=0;
    
    while(b<j)
    {
        z=macierz[1][b];
        macierz[1][b]=macierz[2][b];
        macierz[2][b]=z;
        b++;
    }
        
    wypiszmacierz(i, j, macierz);
        
    getchar();     
}


//-----------------------------------------------------------------------------------------------
void wypiszmacierz(int i, int j, int macierz)
{
   printf("\n");
   int a=0,b=0;
   
   while(a<i)
        {
            while(b<j)
            {
                printf("%d",macierz[a][b]);
                b++;
            }
            
            printf("\n");
            a++;
            b=0;    
        }
        
    printf("\n");
}

błędy przy wywolywaniu funkcji w liniach 35 i 47 :/:

invalid conversion from `int (*)[((unsigned int)((int)j))]' to `int' 
initializing argument 3 of `void wypiszmacierz(int, int, int)' 
1

No bo zadeklarowałeś macierz jako zwykły int:

void wypiszmacierz(int i, int j, int macierz)

Jeśli to ma się skomplikować, to prędzej:

void wypiszmacierz(int i, int j, int macierz[][4])

I zamiast while użyj for, który lepiej pasuje w tym przypadku.

0

Przykładowy kod, który wczyta do pliku tablice 2d. Porównaj sobie ze swoim

#include <stdio.h>
#include <stdlib.h>


#define max_x 2
#define max_y 4

void GetArray2DFromFile(const char *filename, int **array2d)
{
    int ar_x = 0, ar_y = 0;
    FILE *file = fopen(filename, "r");
    if(!file)
    {
        printf("ERROR: cannot open %s\n", filename);
        getchar();
        return;
    }
    while(file != EOF)
    {
        if(ar_y >= max_y) { ar_y = 0; ++ar_x;}
        if(ar_x >= max_x)
            return 0;
        else
        {
            fscanf(file, "%d", &array2d[ar_x][ar_y]);
            ar_y++;
        }
    }
    fclose(file);
    puts("DONE...");
}

void PrintArray2d(int **array2d)
{
    int i, j;
    for(i = 0; i < max_x; i++)
    {
        for(j = 0; j < max_y; j++)
        {
            printf("%d ", array2d[i][j]);
        }
        puts("");
    }
}

int main()
{
    puts("LOADING ARRAY FROM FILE...\n");
    int i = 0;
    int **array = (int**)malloc(max_x*sizeof(int*));
    for(i = 0; i < max_x; i++)
        array[i] = (int*)malloc(max_y*sizeof(int));

    GetArray2DFromFile("liczby.txt", array);
    PrintArray2d(array);
    getchar();
    for(i = 0; i < max_y; i++)
        free(array[i]);
    free(array);
    return 0;
}
 
0
#include <iostream>
#include <iomanip>
using namespace std;

template<size_t Y,size_t X> void showmatrix(int (&tb)[Y][X])
  {
   for(size_t y=0;y<Y;++y,cout<<endl) for(size_t x=0;x<X;++x) cout<<setw(3)<<tb[y][x];
  }
 
int main()
  {
   int A[][3]={{1,2,3},{4,5,6}};
   int B[][2]={{1,2},{3,4},{5,6}};
   showmatrix(A);
   cout<<endl;
   showmatrix(B);
   return 0;
  }

http://ideone.com/nJUutu

1 użytkowników online, w tym zalogowanych: 0, gości: 1