Deklarowanie tablicy jako argument w funkcji

0

Cześć, za zadanie mam napisać program, który będzie mnożył dwie macierze, których wartości pobiera z jednego pliku tekstowego i wynik tworzy w innym pliku. Wszystko robie krok po kroku i zaczalem od mnozenia macierzy 3x3. Nastepnie chciałem zrobić dowolną macierz nxn. Jednakże kiedy utworzyłem funkcję z mnożeniem macierzy pojawia się problem z deklaracją tablicy, gdyż chce by była ona dynamiczna a musze od razu podać jej długość.
Oto kod:

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

int main()
{
    int rowlength,collength;
    int row=0,col=0;
    FILE* file;
    file = fopen("macierz.txt", "r");
    printf("Podaj ilosc wierszy ");
    scanf("%d",&rowlength);
    printf("Podaj ilosc kolumn ");
    scanf("%d",&collength);
    int tab[rowlength][collength], tab1[rowlength][collength], tab2[3][3];

    printf("Elementy w pliku\n\n");

    while( fscanf( file, "%d,", &tab[row][col] ) != EOF )
    {
        printf("%d ", tab[row][col]);
        col++;

        if(col==3 && row==2)   // Ten warunek == wypelnieniem calej tabeli wartoœciami z 1 macierzy.
        {
            printf("\n\n");
            row=0;
            col=0;
            while( fscanf( file, "%d,", &tab1[row][col] ) != EOF )
            {
                printf("%d ", tab1[row][col]);
                col++;
                if(col==3)
                {
                    printf("\n");
                    col=0;
                    row++;
                }
            }
        }
        if(col==3)
        {
            printf("\n");
            col=0;
            row++;
        }
    }
    printf("\n");
    fclose(file);
    int i,j;

    mnozeniemacierzy(tab,tab1);
    FILE* file2;
    file2 = fopen("wynik.txt", "w");
    if(file2==NULL) printf("Nie moge otworzyc!");            //zapisanie do pliku
    else
    {
        fprintf(file2,"Wynik to: \n");
        for(i=0; i<3; i++)
        {
            for(j=0; j<3; j++)
            {
                fprintf(file2,"%d ", tab2[i][j]);
            }
            fprintf(file2,"\n");
        }

        fclose(file2);

    }
    return 0;
}

int mnozeniemacierzy(int tab[][], int tab1[][])
{
    int i,j;
    int tab2[3][3];
    printf("Wynik mnozenia pierwszej macierzy przez druga:\n\n");

    for(i=0; i<3; i++)
    {

        tab2[0][i] = tab[0][0]*tab1[0][i]+tab[0][1]*tab1[1][i]+tab[0][2]*tab1[2][i];

    }
    printf("\n");
    for(i=0; i<3; i++)
    {

        tab2[1][i] = tab[1][0]*tab1[0][i]+tab[1][1]*tab1[1][i]+tab[1][2]*tab1[2][i];

    }
    printf("\n");
    for(i=0; i<3; i++)
    {

        tab2[2][i] = tab[2][0]*tab1[0][i]+tab[2][1]*tab1[1][i]+tab[2][2]*tab1[2][i];

    }
    for(i=0; i<3; i++)
    {
        for(j=0; j<3; j++)
        {
            printf("%d ", tab2[i][j]);
        }
        printf("\n");
    }
}
1

Tak się nie da, Musisz stworzyć tablice wcześniej używając malloc i wysłać wskaźniki do nich (w tym przypadku wskaźnik do wskaźnika do tablicy jednowymiarowej) do funkcji, uproszczone, zarezerwowałem pamięć dla tylko jednej tablicy:

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

void do_stuff(int ** arr, int ** arr1){
    arr[0][0] = 2;
    }

int main(){
    int a, b;
    int** arr;
    scanf("%d",&a);
    scanf("%d",&b);
    int dim_1 = a;
    int dim_2 = b;
    arr = malloc(dim_1 * sizeof(int*));
    for (int i = 0; i < dim_1; i++) {
        arr[i] = malloc(dim_2 * sizeof(int));
}   
    printf("%d\n", arr[0][0]);
    do_stuff(arr, arr);
    printf("%d\n", arr[0][0]);
    // nie zapomnij "uwolnić pammięci":
    for (int i = 0; i < dim_1; i++) {
        free(arr[i]);
}
    free(arr);
    return 0;
}
0

Niezbyt ogarniam temat wskaźników, zawsze unikam tego jak ognia. Poczytałem sobie trochę o tym, ale to jak przez mgłę to widzę. Nie czaje też tego uwalniania pamięci.
Przesłałeś tę samą tablicę i zrobiłeś jedną tablicę dwuwymiarową :P?
Po wywołaniu funkcji do_stuff fakatycznie tablica przyjmuje wartość która przydzielilismy w funkcji. Ale to w takim razie jak to samo zrobić dla dwóch tablic dwuwymiarowych, przesłać

0

Zrobiłem to w inny sposób, troche łopatologicznie ale działa.

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

int main()
{
    int rowlength,collength;
    int row=0,col=0;
    FILE* file;
    file = fopen("macierz.txt", "r");
    printf("Podaj ilosc wierszy ");
    scanf("%d",&rowlength);
    printf("Podaj ilosc kolumn ");
    scanf("%d",&collength);

    int   tab[rowlength][collength],  tab1[rowlength][collength];

    printf("Elementy w pliku\n\n");

    while( fscanf( file, "%d,", &tab[row][col] ) != EOF )
    {
        printf("%d ", tab[row][col]);
        col++;

        if(col==3 && row==2)   // Ten warunek == wypelnieniem calej tabeli wartoœciami z 1 macierzy.
        {
            printf("\n\n");
            row=0;
            col=0;
            while( fscanf( file, "%d,", &tab1[row][col] ) != EOF )
            {
                printf("%d ", tab1[row][col]);
                col++;
                if(col==3)
                {
                    printf("\n");
                    col=0;
                    row++;
                }
            }
        }
        if(col==3)
        {
            printf("\n");
            col=0;
            row++;
        }
    }
    printf("\n");
    fclose(file);

    mnozeniemacierzy(rowlength,collength,tab, tab1);

    return 0;
}

int mnozeniemacierzy(int rowlength, int collength , int tab[rowlength][collength],int tab1[rowlength][collength])

{

    int i,j;
    int tab2[rowlength][collength];
    printf("Wynik mnozenia pierwszej macierzy przez druga:\n\n");

    for(i=0; i<3; i++)
    {

        tab2[0][i] = tab[0][0]*tab1[0][i]+tab[0][1]*tab1[1][i]+tab[0][2]*tab1[2][i];

    }
    printf("\n");
    for(i=0; i<3; i++)
    {

        tab2[1][i] = tab[1][0]*tab1[0][i]+tab[1][1]*tab1[1][i]+tab[1][2]*tab1[2][i];

    }
    printf("\n");
    for(i=0; i<3; i++)
    {

        tab2[2][i] = tab[2][0]*tab1[0][i]+tab[2][1]*tab1[1][i]+tab[2][2]*tab1[2][i];

    }
    for(i=0; i<3; i++)
    {
        for(j=0; j<3; j++)
        {
            printf("%d ", tab2[i][j]);
        }
        printf("\n");
    }
    zapisywanie(rowlength, collength, tab2);
}
void zapisywanie (int rowlength, int collength, int tab2[rowlength][collength])
{
    int i,j;
    FILE* file2;
    file2 = fopen("wynik.txt", "w");
    if(file2==NULL) printf("Nie moge otworzyc!");            //zapisanie do pliku
    else
    {
        fprintf(file2,"Wynik to: \n");
        for(i=0; i<3; i++)
        {
            for(j=0; j<3; j++)
            {
                fprintf(file2,"%d ", tab2[i][j]);
            }
            fprintf(file2,"\n");
        }

        fclose(file2);

    }
}
1

Zrobilem Ci proof of concept. A jak to skompilowales, myslalem, ze w C rozmiar tablic deklarowanych na stosie music byc znany na etapie kompilacji

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