Jak się przekazuje tablice do funkcji?

0

Mam taki problem mam program w języku c i nie wiem jak przekazać tablice do funkcji próbowałem na różne sposoby np takie

double pi[10];

pi(&pi);
void funkcja ( double *pi) {

}

3

funkcja(pi);. Poza tym przydałoby się przekazać też rozmiar tej tablicy.

0

Próbowałem na różne sposoby i za każdym razem wywala takie błędy

poronywanie.c: In function ‘main’:
poronywanie.c:71:23: warning: initialization from incompatible pointer type
      double *wynik2 = &wynik;
                       ^
poronywanie.c: At top level:
poronywanie.c:80:11: warning: conflicting types for ‘sortowanie_babelkowe’
      void sortowanie_babelkowe(double *tab[],int n)
           ^
poronywanie.c:72:6: note: previous implicit declaration of ‘sortowanie_babelkowe’ was here
      sortowanie_babelkowe(&wynik, 10);
      ^
/tmp/cc1cx3yC.o: In function `sortowanie_babelkowe':
poronywanie.c:(.text+0x2f7): undefined reference to `swap'
collect2: error: ld returned 1 exit status

0

Przekaż tablicę tak:

#include<stdio.h>

// albo tak:
// void foo(double tab[], size_t size)
void foo(double *tab, size_t size)
{
    printf("Size: %d\n", size);
}

int main()
{
    double numbers[] = { 1,2,3 };

    foo(numbers, sizeof(numbers) / sizeof(numbers[0]));
    return 0;
}

Tablicy nie trzeba przekazywać przez wskaźnik, bo przekazując tablicę do funkcji przekazujesz oryginał, a nie kopię. Wyobraź sobie co by się musiało dziać kiedy trzeba byłoby przekazywać kopię wielkiej tablicy. To byłoby bez sensu przecież. Modyfikując tablicę wewnątrz funkcji działasz na oryginalnych danych. Poczytaj o przekazywaniu argumentów przez wskaźnik oraz przez wartość. Zresztą w linku, który Ci podałem jest wszystko opisane.

0

Nadal wywala mi takie błędy
może dam cały kod

    int main()
    {
      char *tablica[10];
      tablica[0] = "to";
      tablica[1] = "ja";
      tablica[2] = "t";
      tablica[3] = "po";
      tablica[4] = "t2";
      tablica[5] = "t";
      tablica[6] = "me";
      tablica[7] = "pi";
      tablica[8] = "p";
      tablica[9] = "a";
      
        char pierwszy[100];

     printf("Podaj");
     scanf("%s",pierwszy);

     int i;
     double wynik[20];
     
     for (i =0;i <= 10;i++) {
       
       wynik[i] = tablica[i];
       
     }
     //double *wynik2 = &wynik;
     sortowanie_babelkowe(wynik, sizeof(wynik) / sizeof(wynik[0]), 10);
     printf("%f",wynik[0]);
     
     
        return 0;
    }

    
     void sortowanie_babelkowe(double *tab,int n)
{	int i,j;
	for( i=0;i<n;i++)
		for(j=1;j<n-i;j++) //pętla wewnętrzna
		if(tab[j-1]>tab[j])
			//zamiana miejscami
			swap(tab[j-1], tab[j]);
}

i WYWALA MI TAKIE BŁĘDY

poronywanie.c:80:11: warning: conflicting types for ‘sortowanie_babelkowe’
      void sortowanie_babelkowe(double *tab,int n)
           ^
poronywanie.c:72:6: note: previous implicit declaration of ‘sortowanie_babelkowe’ was here
      sortowanie_babelkowe(wynik, sizeof(wynik) / sizeof(wynik[0]), 10);
      ^
/tmp/cc4uCqxa.o: In function `sortowanie_babelkowe':
poronywanie.c:(.text+0x303): undefined reference to `swap'
collect2: error: ld returned 1 exit status

1
  • Gdzie masz funkcję swap?
  • Gdzie masz #include<stdio.h>?
  • Funkcja main nic nie wie o funkcji sortowanie_babelkowe. Przenieś definicję powyżej main lub zapisz tam prototyp funkcji sortowanie_babelkowe;
  • for (i =0;i <= 10;i++) wychodzisz poza granicę dziesięcioelementowej tablicy; o jedeną iterację za dużo;

To tak na pierwszy rzut oka.

Nie możesz pisać w C tak jakbyś pisał w PHP. To są dwa zupełnie różne języki, a podobieństwa są czysto składniowe.

@pol90 dajmy na to:

#include<stdio.h>

void swap(int tab[], size_t i, size_t j)
{
    int temp = tab[i];
    tab[i] = tab[j];
    tab[j] = temp;
}

// z pamięci pisane.
void sort(int tab[], size_t size)
{
    size_t i = 0;
    for (; i < size; ++i)
    {
        size_t j = 0;
        for (; j < i; ++j)
        {
            if (tab[i] < tab[j])
            {
                swap(tab, i, j);
            }
        }
    }
}

void show(int tab[], size_t size)
{
    size_t i = 0;
    for (; i < size; ++i)
    {
        printf("%d, ", tab[i]);
    }
    putchar('\n');
}

int main()
{
    int numbers[] = { 3, 2, 7, 4, 1, -4, 3, 1 };

    size_t size = sizeof(numbers) / sizeof(numbers[0]);

    sort(numbers, size);
    show(numbers, size);

    return 0;
}
1
wynik[i] = tablica[i];

Mieszasz typy danych – wynik zawiera liczby zmiennoprzecinkowe, a tablica ciągi znaków.

0

Działa mi taki kod

#include<stdio.h>
#include<string.h>
     
    double porownaj(const char* pierwszy, const char* drugi) {
     
        if (pierwszy != NULL && drugi != NULL)
        {
            int ilosc_znakow_pierwszego = strlen(pierwszy);
            int ilosc_znakow_drugiego = strlen(drugi);
            int prawidlowa = 0;
            int ilosc_znakow_najwiekszego_stringa = 0;
     
            if (ilosc_znakow_pierwszego > ilosc_znakow_drugiego)
                ilosc_znakow_najwiekszego_stringa = ilosc_znakow_pierwszego;
            else
                ilosc_znakow_najwiekszego_stringa = ilosc_znakow_drugiego;
     
            int i;
            for (i =0; i < ilosc_znakow_najwiekszego_stringa; ++i)
            {
                if (pierwszy[i] == '\0' || drugi[i] == '\0')
                    break;
     
                if (pierwszy[i] != drugi[i]) --prawidlowa;
                else if (pierwszy[i] == drugi[i]) ++prawidlowa;
            }
     
            double wynik = (ilosc_znakow_pierwszego + ilosc_znakow_drugiego) / 2.0;
            double finalny_wynik = prawidlowa / wynik;
     
            return finalny_wynik;
        }
        return -1;
    }
          double sortowanie_babelkowe(double *tab,int n)
{	int i,j;
	double tym;
	for( i=0;i>n;i++) {
		for(j=1;j>n-i;j++) {//pętla wewnętrzna
		if(tab[j+1]<tab[j]) {
			//zamiana miejscami
			//swap(tab[j-1], tab[j]);
		  tym = tab[j+1];
		  tab[j+1] = tab[j];
		  tab[j] = tym;
		}
		printf("%f\n",tab[j]);
		}
		
	}
	printf("\n\n");
	for( i=0;i<n;i++) {
	  printf("%f\n",tab[i]);
	}
	//printf("\n\n");
	return tab[0];
}
    int main()
    {
      char *tablica[10];
      tablica[0] = "to";
      tablica[1] = "ja";
      tablica[2] = "to";
      tablica[3] = "po";
      tablica[4] = "ti";
      tablica[5] = "y";
      tablica[6] = "mo";
      tablica[7] = "m";
      tablica[8] = "e";
      tablica[9] = "w";
      
        char pierwszy[100];
     char drugi[100];
     printf("Podaj pierwszy napis");
     scanf("%s",pierwszy);
     //printf("Podaj drugi napis");
     //scanf("%s",drugi);
     int i;
     double wynik[20],wynik2;
     
     for (i =0;i <= 10;i++) {
       
       wynik[i] = porownaj(pierwszy, tablica[i]);
       //printf("%f\n",wynik[i]);
       
     }
     //double *wynik2 = &wynik;
     wynik2 = sortowanie_babelkowe(wynik, 10);
     printf("%f",wynik2);
     
     
        return 0;
    }

Tylko

#include<stdio.h>
#include<string.h>

    double porownaj(const char* pierwszy, const char* drugi) {
     
        if (pierwszy != NULL && drugi != NULL)
        {
            int ilosc_znakow_pierwszego = strlen(pierwszy);
            int ilosc_znakow_drugiego = strlen(drugi);
            int prawidlowa = 0;
            int ilosc_znakow_najwiekszego_stringa = 0;
     
            if (ilosc_znakow_pierwszego > ilosc_znakow_drugiego)
                ilosc_znakow_najwiekszego_stringa = ilosc_znakow_pierwszego;
            else
                ilosc_znakow_najwiekszego_stringa = ilosc_znakow_drugiego;
     
            int i;
            for (i =0; i < ilosc_znakow_najwiekszego_stringa; ++i)
            {
                if (pierwszy[i] == '\0' || drugi[i] == '\0')
                    break;
     
                if (pierwszy[i] != drugi[i]) --prawidlowa;
                else if (pierwszy[i] == drugi[i]) ++prawidlowa;
            }
     
            double wynik = (ilosc_znakow_pierwszego + ilosc_znakow_drugiego) / 2.0;
            double finalny_wynik = prawidlowa / wynik;
     
            return finalny_wynik;
        }
        return -1;
    }
          double sortowanie_babelkowe(double *tab,int n)
{	int i,j;
	double tym;
	for( i=0;i>n;i++) {
		for(j=1;j>n-i;j++) {//pętla wewnętrzna
		if(tab[j+1]<tab[j]) {
			//zamiana miejscami
			//swap(tab[j-1], tab[j]);
		  tym = tab[j+1];
		  tab[j+1] = tab[j];
		  tab[j] = tym;
		}
		printf("%f\n",tab[j]);
		}
		
	}
	printf("\n\n");
	for( i=0;i<n;i++) {
	  printf("%f\n",tab[i]);
	}
	//printf("\n\n");
	return tab[0];
}
    int main()
    {
      char *tablica[10];
      tablica[0] = "to";
      tablica[1] = "ja";
      tablica[2] = "to";
      tablica[3] = "po";
      tablica[4] = "ti";
      tablica[5] = "y";
      tablica[6] = "mo";
      tablica[7] = "m";
      tablica[8] = "e";
      tablica[9] = "w";
      
        char pierwszy[100];
     char drugi[100];
     printf("Podaj pierwszy napis");
     scanf("%s",pierwszy);
     //printf("Podaj drugi napis");
     //scanf("%s",drugi);
     int i;
     double wynik[20],wynik2;
     
     for (i =0;i <= 10;i++) {
       
       wynik[i] = porownaj(pierwszy, tablica[i]);
       //printf("%f\n",wynik[i]);
       
     }
     //double *wynik2 = &wynik;
     wynik2 = sortowanie_babelkowe(wynik, 10);
     printf("%f",wynik2);
     
     
        return 0;
    }

Tylko, że on nie sortuje dobrze wartości z tablicy i druga sprawa jak przekazać do funkcji tablicę wielowymiarową, a inaczej jak zadeklarować tablicę w c, która pierwszy typ danych to są liczby zmiennoprzecinkowe a drugi to stringi ?

1
 for (i =0;i <= 10;i++) {

Tą pętlą wychodzisz poza zakres tablicy tablica.
W zmiennej trzymasz dziesięcio-elementową tablicę o indeksach 0, 1, 2, ..., 9, podczas gdy Ty próbujesz się odwołać do 10.

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