[C++], przesyłanie do funkcji struktury i tablicy

Mam program podzielony na 3 pliki 1 - deklaracja struktury i prototypy funkcji, 2 definicje funkcji, 3 - funkcja main.

Struktura nazywa się Sales. Nie wiem jaki kod napisać by przesłać dane do funkcji setSales(Sales & s, const double ar[], int n);

jak mógłby wyglądać kod?

Na pewno musi być:

struct Sales { … };

reszta może być na setki innych sposobów.

ale nie wiem jak napisać definicje w funkcji main bo strukturę mam i definicję tej funkcji. Osobno umiem przesyłać do funkcji i strukturę i tablicę ale nie razem.

Niczym się nie różni jak przesyłasz osobno tak samo przesyłasz razem.

Na ile rozumiem definicje funkcji musisz mieć w osobnym pliku, więc o jaką “definicje w funkcji main” ci chodzi?

o to, że jak napiszę kod typu:

Sales sales1;

const int MAX = 4;

double arr[MAX] = { zmienne_double};

setSales(sales1, arr[], MAX); // nie działa próbowałem zmieniać inaczej deklarować, nic.

Nic dziwnego - co to za zapis arr[] :?: Tablicę przesyłasz podając adres elementu (najczęściej początkowego):

setSales(sales1, arr, MAX);    //nazwa tablicy jest równocześnie adresem zerowego jej elementusetSales(sales1, arr[0], MAX);    //adres 0-elementusetSales(sales1, arr[3], MAX);    //adres 3-elementu



Zapis z pustymi nawiasami kwadratowymi [b][][/b] może wystąpić tylko na liście argumentów formalnych.

Też nie działa failed:

unresolved external symbol “void __cdecl SALES::setSales(struct SALES::Sales &,double const * const,int)” (?setSales@SALES@@YAXAAUSales@1@QBNH@Z) referenced in function _main

To jest już błąd linkera.

1-szy plik, ten ze strukturą i z deklaracjami powinien mieć rozszerzenie *.h. Jego włączasz dyrektywą

#include "Naglowek.h" [/code]

Do tych dwóch pozostałych plików. To są podstawy…

Wszystko jest dobrze jeśli sobie np zapiszę deklaracje tablicy, struktury i skompiluje, problem zaczyna się gdy wywołuję funkcje.

Dodane 23.02.2010 (Wt) 20:51

zapomniałem napisać, że struktura jest w przestrzeni nazw SALES, gdy usunę przestrzeń nazw to działają te wywołania. Co może być nie tak? skoro kiedy nie wywołuje funkcji z main to działa przestrzeń nazw SALES idealnie?

Przestrzeń nazw zawsze “działa idealnie” (ona mieści w sobie po prostu jakieś nazwy - trudno żeby to nie działało ^.^). Ty po prostu czasem nie wzbogacasz nazw z tej przestrzeni o nazwę tej przestrzeni. Przykładowo:

namespace SALES{    struct strukt{        //...    };

Znaczy udostępniłem tak:

#include

#include “Sales1.h”

using namespace SALES;

i myślałem, że pójdzie ale nie poszło.

Wrzuć w takim razie kod wszystkich 3-ech plików bo nie chce mi się zakładać co możesz robić źle.

struct a nie strukt

Słowo kluczowe jest takie jak powinno być - czyli struct :slight_smile:

Sales1.h

#ifndef SALES_H_

#define SALES_H_


namespace SALES

{

	const int QUARTERS = 4;

	struct Sales

	{

		double sales[QUARTERS];

		double average;

		double max;

		double min;

	};

	void setSales(Sales & s, const double ar[], int n);

	void setSales(Sales & s);

	void showSales(const Sales & s);

}

#endif

plik drugi Sales1.cpp

#include 

#include "Sales1.h"


using namespace SALES;



void setSales(Sales & s, const double ar[], int n)

{

	s.average = ar[0];

	for (int i = 0; i < n - 1; i++)

	{

		if (ar[i] > ar[i + 1])

			s.max = ar[i];

		else

			s.max = ar[i + 1];

		if (ar[i] < ar[i + 1])

			s.min = ar[i];

		else 

			s.min = ar[i + 1];

		s.average = ar[i + 1];

	}

}

plik main.cpp

#include 

#include "Sales1.h"


using namespace SALES;

const int MAX = 4;

int main()

{

	Sales sales1;

	double tab[MAX];

	setSales(sales1, tab, MAX);


	std::cin.get();

	return 0;

}

Funkcję musisz zdefiniować z uwzględnieniem nazwy przestrzeni nazw:

void SALES::setSales(Sales & s, const double ar[], int n)

Wszystko działa, taki mały błąd a spędziłem dwa dni nad nim i nic. Dziękuję za pomoc. ;d

Dodane 24.02.2010 (Śr) 23:11

Dlaczego gdy chcę wypisać tablicę w osobnej funkcji to wyświetlają się jakieś bzdury?

#include 

#include "Sales1.h"


using namespace SALES;


void SALES::setSales(Sales & s, const double ar[], int n)

{

	using std::cout;

	s.max = 0;

	s.min = ar[0];

	s.average = 0;

	for (int i = 0; i < n; i++)

	{

		if (s.max < ar[i])

			s.max = ar[i];

		if (s.min > ar[i])

			s.min = ar[i];

		s.average += ar[i];

	}

	s.average /= n;

}



void SALES::setSales(Sales & s)

{

	using std::cin;

	using std::cout;


	cout << "Podaj informacje dla 4 kwartalow:\n";

	int i;

	for (i = 0; i < QUARTERS; i++)

		cin >> s.sales[i];


}


void SALES::showSales(const Sales & s)

{

	using std::cout;

	cout << "Tablica: ";

	for(int i = 0; i < QUARTERS; i++)

		cout << std::endl << s.sales[i];

	cout << "\nMinimum: " << s.min;

	cout << "\nMaksimum: " << s.max;

	cout << "\nSrednia: " << s.average;

}

#include 

#include "Sales1.h"


using namespace SALES;



int main()

{

	const int MAX = 4;

	Sales sales1;

	double arr[MAX] = { 23.5, 34.2, 123.7, 12.9 };

	//sales1.sales[0] = arr[0];

	SALES::setSales(sales1, arr, MAX);

	showSales(sales1);

	for (int i = 0; i < MAX; i++)

		sales1.sales[i] = arr[i];



	std::cin.get();

	return 0;

}