Hej. För det första: Det är lite märkligt upplagt, man brukar inte lägga alla "strukturer" i en fil. Snarare en fil för en struktur och de funktioner som är relaterade till den. Ok! då är jag med... Då skall vi se här... Jag vill nog försöka bevara att samla strukturerna i en egen fil för att kunna komma åt dem smidigt. I labben som vi håller på med så hanterar vi txt-filer osv. Och då använder jag ju struktorn(använder strukturer.h) för att dels hämta in information om en post som skall läggas till.... tänkte sedan skicka över den till en annan cpp-fil som skall hantera själva skrivningen till filen. Den här filen skall även den användas för att söka osv i filerna (som jag tänkt det iaf). Ja, där har du tänkt rätt även om terminologin är fel, men det vanligaste är att man istället inkluderar strukturer.h ifrån minafunk.h. Ok... skall försöka strukturera om lite då. <b>>Så istället för att ha en fil som tar hand om all kod som filhantering från alla "delarna" så är det då alltså bättre att splittra upp och ha filhantering som hör till kund - i kund osv...</b>Struktur som argument?
Mitt problem är följande.
Problemet involverar 3 filer.
Först - en sammanställning över mina funktioner och subrutiner. Den ligger i en header enligt:
//minafunk.h
//I main:
//...finns fler funktioner i den här filen...
int AntalPoster(char filnamn[], char task);
void LagraKund(const Kund k[], const int n);
En fil för strukturer:
//strukturer.h
struct Kund
{
int iKundID;
char cKundNamn[25];
char cAdress[30];
};
Då till själva problemet. Jag har två ytterligare filer i sammanhanget här;
* kundhantering.cpp
* filhantering.cpp
Ovan fungerar enligt följande:
//Kundhantering.cpp
void LaggTillKund()
{
Kund nyKund =
{
AntalPoster("txtFiler/ProgramData/Kunddata.txt", 's')+1,
"cKundNamn",
"cKundAdress"
};
//Hämtar nu information för att lägga till kund.
cout << "Ange KundNamn: > ";
cin.getline(nyKund.cKundNamn, 24);
cout << "Ange Kundens Adress: > ";
cin.getline(nyKund.cAdress, 29);
//HÄR börjar anropet till "LagraKund". Rätt?
LagraKund(nyKund, 0);
cout << endl;
char Rubrik2[] = "Lagrad Information";
//nedan mest en test för att se om struktorn har lagrats - och det har den.
frmtRubrik(Rubrik2);
cout
<< "KundID:(genereras): \t" << nyKund.iKundID << endl
<< "KundNamn: \t\t" << nyKund.cKundNamn << endl
<< "KundAdress: \t\t" << nyKund.cAdress << endl;
system("PAUSE");
}
Sedan "på andra sidan" i filhanteringen där just filhanteringen är tänkt att ske... så ser det ut så här i void LagraKund();
void LagraKund(const Kund k[], const int n)
{
for (int i=0;i<n;i++)
//Testar bara att skriva ut informationen här för att veta att jag fått fram informationen.
cout << k[i].iKundID << ", " << k[i].cKundNamn << ", " << k[i].cAdress;
}
Kan ni, som är proffs på det här direkt se vad som inte funkar? eller hur gör man i liknande situationer?
//Fredrik L
Sv: Struktur som argument?
För det andra: Känner du till klasser? Det vore perfekt att använda i det här fallet.
För det tredje: Vad du åtminstone borde göra för att underlätta är att ersätta char [] med std::string och x[] med std::vector, så slipper du en del problem.
För det fjärde: Vad är det för problem?Sv:Struktur som argument?
Angående klasser.. Japp hehe. inga problem. Jag hade gärna programmerat objektorienterat men applikationen jag skriver är en kurs i Strukturerad Programmering... (som jag har släpandes hehe..)
När jag kommer hem skall jag titta på om jag inte flyttar ut strukturerna isf.
(är väl inte en jättehejare på c++ utan detta är i princip det första jag skriver...)
//Fredrik LSv:Struktur som argument?
Det som felar är funktionsdeklarationen i "minafunk.h".
Som synes här:
1>Compiling...
1>filhantering.cpp
1>c:\documents and settings\fredrik\my documents\skolan\c++\lab2v2\lab2v2\minafunk.h(17) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\documents and settings\fredrik\my documents\skolan\c++\lab2v2\lab2v2\minafunk.h(17) : error C2146: syntax error : missing ',' before identifier 'k'
1>formatering.cpp
1>c:\documents and settings\fredrik\my documents\skolan\c++\lab2v2\lab2v2\minafunk.h(17) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\documents and settings\fredrik\my documents\skolan\c++\lab2v2\lab2v2\minafunk.h(17) : error C2146: syntax error : missing ',' before identifier 'k'
1>c:\documents and settings\fredrik\my documents\skolan\c++\lab2v2\lab2v2\formatering.cpp(6) : warning C4267: 'initializing' : conversion from 'size_t' to 'int', possible loss of data
1>c:\documents and settings\fredrik\my documents\skolan\c++\lab2v2\lab2v2\formatering.cpp(17) : warning C4267: 'initializing' : conversion from 'size_t' to 'int', possible loss of data
1>kundhantering.cpp
1>c:\documents and settings\fredrik\my documents\skolan\c++\lab2v2\lab2v2\minafunk.h(17) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\documents and settings\fredrik\my documents\skolan\c++\lab2v2\lab2v2\minafunk.h(17) : error C2146: syntax error : missing ',' before identifier 'k'
1>c:\documents and settings\fredrik\my documents\skolan\c++\lab2v2\lab2v2\kundhantering.cpp(26) : error C2660: 'LagraKund' : function does not take 2 arguments
1>metodhantering.cpp
1>c:\documents and settings\fredrik\my documents\skolan\c++\lab2v2\lab2v2\minafunk.h(17) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\documents and settings\fredrik\my documents\skolan\c++\lab2v2\lab2v2\minafunk.h(17) : error C2146: syntax error : missing ',' before identifier 'k'
1>modMain.cpp
1>c:\documents and settings\fredrik\my documents\skolan\c++\lab2v2\lab2v2\minafunk.h(17) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\documents and settings\fredrik\my documents\skolan\c++\lab2v2\lab2v2\minafunk.h(17) : error C2146: syntax error : missing ',' before identifier 'k'
1>Generating Code...
1>Build log was saved at "file://c:\Documents and Settings\Fredrik\My Documents\Skolan\c++\Lab2V2\Lab2V2\Debug\BuildLog.htm"
1>Lab2V2 - 11 error(s), 2 warning(s)
minafunk.h(17) är alltså den här:
void LagraKund(const Kund k[], const int n);
Jag har provat 3 olika sätt för att lösa den här biten. Dels "Struktor som referensparameter", "struktor som vektorparameter (-så som det ser ut nu)" samt "Struktor som pekarparameter"
Ovan säger kanske inte så mycket. Jag har en liten idé på va det kan vara. I vilken ordning bör jag läsa in prylarna... som det är nu så ligger raden #include minafunk.h _före_ raden för #include strukturer.h ?
Tänkte om ordningen här har betydelse - att minafunk.h måste "veta" om strukturer.h? och därför borde strukturer.h ligga före minafunk.h?
//Fredrik LSv: Struktur som argument?
Ditt argument om var du vill ha grejer köper jag däremot inte. Tanken är så här:
1. Det finns två typer av filer, header- och source-.
2. Source innehåller (nästan) all källkod.
3. Header innehåller alla deklarationer, och i en del fall lite kod (och det har tenderat att bli kod oftare).
Varje source-fil inkluderar allt den behöver, varje headerfil inkluderar allt den behöver. Allting ska alltså vara "oberoende". Du ska kunna inkludera en fil, och då får du automatiskt allt du behöver för att använda den filen.
En effekt av detta är att det blir ganska meningslöst att ha en fil med alla strukturer. Istället så bör man ha en fil som deklararerar strukturen och alla de nödvändiga, självklara funktionerna som hör till den (konvertera till sträng, etc.).
I och med det har du också en ganska märklig namngivning. Jag skulle istället ha lagt upp det som
kund.h
struct Kund
{ ... }
//Kund-specifika funktioner
//...
kund_to_file.h
#include<kund.h>
void lagra_kund(...)
...
Du tänker lite snurrigt när du säger att du vill skicka saker mellan cpp-filer. Se det istället som att du skriver koden för någon annan, hur vill den personen jobba med din kod?
Sv:Struktur som argument?
Just den här labben som vi håller på med nu... Kommer egentligen hantera tre saker... dels kunder, artiklar och däremellan ordrar.
Så istället för att ha en fil som tar hand om all kod som filhantering från alla "delarna" så är det då alltså bättre att splittra upp och ha filhantering som hör till kund - i kund osv...
Om jag förstår dig rätt oxå så om det är så... att man vill ha enstaka globala funktioner (tex textformateringsfunktioner osv) så kan ha detta som en egen fil - och att den inkluderas i de andra includefilerna som man har...?
//Fredrik LeufkensSv: Struktur som argument?
Ja, normalt sätt är det så man lägger upp det. Men just det är lite av en balansgång, det beror på hur strukturen är uppbyggd.
I princip ska saker som inte beror av andra verkligen inte heller inkludera dem, och vice versa. Man kan tänka sig ett scenario i stil med:
-hela strukturen på alla andra grejer är väldigt fast,
-du gör ett filhanteringsbibliotek som bara ska fungera för den strukturen,
-man bara ibland vill ha filhantering, och vill man ha det vill man definitivt ha det för hela strukturen.
Då kan det vara vettigt med ett upplägg i stil med det du beskrev. Men det vanligaste är snarare att varje entitet (t.ex. kund) innehåller allt det själv behöver.
<b>>Om jag förstår dig rätt oxå så om det är så... att man vill ha enstaka globala funktioner (tex textformateringsfunktioner osv) så kan ha detta som en egen fil - och att den inkluderas i de andra includefilerna som man har...?</b>
Låter mycket vettigt i ett imperativt språk som C++.
Sen kan jag också tipsa om att du nog bör namnge på engelska, det blir i stort sett alltid snyggare.