• 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

Object Storage Arubacloud
0 głosów
253 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 (154,820 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 (154,820 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 (154,820 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ź 483 wizyt
0 głosów
0 odpowiedzi 161 wizyt
pytanie zadane 12 stycznia 2020 w C i C++ przez poldeeek Mądrala (5,980 p.)
0 głosów
1 odpowiedź 329 wizyt
pytanie zadane 4 grudnia 2022 w C i C++ przez Janchess Początkujący (480 p.)

92,556 zapytań

141,404 odpowiedzi

319,561 komentarzy

61,942 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...