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) {
}
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) {
}
funkcja(pi);
. Poza tym przydałoby się przekazać też rozmiar tej tablicy.
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
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.
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
swap
?#include<stdio.h>
?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;
}
wynik[i] = tablica[i];
Mieszasz typy danych – wynik
zawiera liczby zmiennoprzecinkowe, a tablica
ciągi znaków.
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 ?
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
.