• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przesyłanie dwóch tablic między funkcjami

0 głosów
832 wizyt
pytanie zadane 14 stycznia 2018 w C i C++ przez must Bywalec (2,980 p.)

Wie ktoś może jak to zrobić. 

Wywaliłem do funkcji z maina całe czytanie z pliku tekstowego. Nazywa się ta funkcja 

ReaderValues

 Jednakże funkcja

Multiplication 

używa tychże dwóch tablic i teraz mam problem, bo jak miałem to w mainie to po prostu przesyłałem je jako argument i tyle. Najlepiej, żeby obyło się to bez wskaznikow, jezeli sie nie da, to moga w ostatecznosci byc te wskaźniki :D 

Czyli działa to tak: W funkcji ReaderValues są czytane wartości z pliku i przypiswane do tablic, z których korzysta pozniej funkcja Multiplication.

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

int main(int argc, char* argv[])
{

    if(argc < 3)
    {
        printf("Za malo argumentow");
        return 0;
    }

    int rowlength,collength,row2length,col2length;
    int row=0,col=0;


    printf("Input number of rows for the first array!");
    scanf("%d",&rowlength);
    printf("Input number of columns for the first array!");
    scanf("%d",&collength);
    printf("Input number of rows for the second array!");
    scanf("%d",&row2length);
    printf("Input number of columns for the second array!");
    scanf("%d",&col2length);

    printf("Elements in the text file:\n\n");

    FILE* file = fopen(argv[1], "r");

    ReaderValues(file,rowlength,collength,row2length,col2length);

    fclose(file);

    Multiplication(rowlength,collength,row2length,col2length, tab, tab1,argv);

    return 0;
}


void ReaderValues(FILE* file, int rowlength, int collength, int row2length, int col2length)
{
    int tab[rowlength][collength],tab1[row2length][col2length];
    int row=0,col=0;
    while( fscanf( file, "%d,", &tab[row][col] ) != EOF )  //WCZYTYWANIE WARTOŚCI Z PLIKU TXT DO 2 TABLIC
    {

        printf("%d ", tab[row][col]);

        col++;

        if(col==collength && row==rowlength-1)
        {
            printf("\n\n");
            row=0;
            col=0;

            while( fscanf( file, "%d,", &tab1[row][col] ) != EOF )
            {

                printf("%d ", tab1[row][col]);
                col++;

                if(col==col2length)

                {
                    printf("\n");
                    col=0;
                    row++;
                }
            }
        }
        if(col==collength)
        {
            printf("\n");
            col=0;
            row++;
        }
    }
    printf("\n");
}

int Multiplication(int rowlength, int collength, int row2length, int col2length, int tab[rowlength][collength],int tab1[row2length][col2length],char* argv[]) // MNOŻENIE MACIERZY
{
    int i,j,k;
    int tab2[rowlength][col2length];
    printf("Result of multiplication:\n\n");

    for(i=0; i<rowlength; i++)
    {
        for(j=0; j<col2length; j++)
        {
            tab2[i][j] = 0;
            for(k=0; k<row2length; k++)
            {
                tab2[i][j] += tab[i][k] * tab1[k][j];
            }
        }
    }

    for(i=0; i<row2length; i++)
    {
        for(j=0; j<col2length; j++)
        {
            printf("%d ", tab2[i][j]);
        }
        printf("\n");
    }
    Save(row2length, col2length, tab2, argv);
}
void Save(int row2length, int col2length, int tab2[row2length][col2length], char* argv[]) // ZAPISYWANIE MACIERZY WYNIKOWEJ DO PLIKU
{
    int i,j;
    FILE* file2;
    file2 = fopen(argv[2], "w");
    if(file2==NULL) printf("Can't open the file!");

    else
    {
        fprintf(file2,"The result: \n");

        for(i=0; i<row2length; i++)
        {
            for(j=0; j<col2length; j++)
            {
                fprintf(file2,"%d ", tab2[i][j]);
            }

            fprintf(file2,"\n");
        }

        fclose(file2);

    }
}

 

1 odpowiedź

+1 głos
odpowiedź 14 stycznia 2018 przez tangarr Mędrzec (155,140 p.)
wybrane 14 stycznia 2018 przez must
 
Najlepsza

Bez wskaźnika się nie obejdzie. Masz przykład:

 

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

int* utworzTablice(int rozmiar) {
    return (int*) malloc(rozmiar*sizeof(int));
}

void wyczyscTablice(int *tablica, int rozmiar) {
    int i;
    for (i=0; i<rozmiar; i++)
        tablica[i] = 0;
}

void ustawPole(int *tablica, int pole, int wartosc) {
    tablica[pole] = wartosc;
}

int pobierzPole(int *tablica, int pole) {
    return tablica[pole];
}

int main() {
    int i, rozmiar;
    int *tablica;
    rozmiar = 10;
    tablica = utworzTablice(rozmiar);
    wyczyscTablice(tablica, rozmiar);
    ustawPole(tablica, 0, 999);
    for (i = 0; i< rozmiar; i++)
        printf("%d ", pobierzPole(tablica, i);
    free(tablica);
    return 0;
}

 

komentarz 14 stycznia 2018 przez must Bywalec (2,980 p.)
Dobra, nieważne nareszcie wszystko działa.... W takim razie dlaczego nie można tymi wskaźnikami tutaj robić?
1
komentarz 14 stycznia 2018 przez tangarr Mędrzec (155,140 p.)

Poprawiłem poprzedni przykład.
Powinno być fun_wskaznik(&liczba);
Mówiłem, że da rade tylko przez wskaźnik i mówiłem też, że każda tablica jest wskaźnikiem.
Nie wiedziałem jednak, że w C dodano możliwość przekazania tablicy wraz z dokładnym typem (mea culpa).

komentarz 14 stycznia 2018 przez must Bywalec (2,980 p.)
Teraz mi sie wydaje wszystko logiczne :D Dzięki wielkie. Doszlismy do końca :P
1
komentarz 14 stycznia 2018 przez tangarr Mędrzec (155,140 p.)
Problem można rozwiązać na oba sposoby.
Jednak bezpieczniej jest zachowywać zgodność typów.
Nigdy nie interesowałem się nowszym standardem C. Na studiach zawsze używaliśmy standardu ansi C. Zresztą nieważne, przepraszam, jeżeli narobiłem ci zbyt dużo mętliku w głowie, chciałem żebyś zrozumiał czym są wskaźniki.

Dam ci jedną bardzo ważną radę: używaj nowoczesnego kompilatora i czytaj wszystkie warningi. Zawsze staraj się je naprawiać. Dzięki temu unikniesz wielu przykrych błędów, których się nawet nie spodziewasz.
komentarz 14 stycznia 2018 przez must Bywalec (2,980 p.)
Do C używam CodeBlocksa.

Do Javy IntelliJ.

Dowiedziałem się ostatno że Intellij ma również odpowiednik dla C/C++ i pewnie zaraz po feriach zaczne go uzywac, ponieważ dla studentów jest darmowy :)

 

Dzięki raz jeszcze!:)

Podobne pytania

0 głosów
1 odpowiedź 880 wizyt
0 głosów
0 odpowiedzi 296 wizyt
pytanie zadane 12 stycznia 2020 w C i C++ przez poldeeek Mądrala (5,980 p.)
0 głosów
1 odpowiedź 761 wizyt
pytanie zadane 4 grudnia 2022 w C i C++ przez Janchess Początkujący (480 p.)

93,743 zapytań

142,680 odpowiedzi

323,299 komentarzy

63,330 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...