Problém s opsaným kódem z knihy "thinking in the c++" – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Problém s opsaným kódem z knihy "thinking in the c++" – C / C++ – Fórum – Programujte.comProblém s opsaným kódem z knihy "thinking in the c++" – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
pidgin0
Návštěvník
1. 9. 2010   #1
-
0
-

Snažím se ... proto taky opisuji kód a tak dále. znáte to. Ale narazil jsem na problém. Jsou vytvořené tři soubory.
1. CLib.h
2. CLib.cpp
3. CLibTest.cpp

Tyto tři se snažím přeložit, ale hlásí mi to chybu při překladu. A pro mě nepochopitelnou(jak jinak). Neboť když vše Z ClibTest.cpp překopíruji do CLib.cpp a CLibTest.cpp z projektu odstraním tak to vše funguje. Jinak to při překladu hlásí chybu "špatná konverze typů z int* do int". Přikládám zdrojové soubory a tak trochu doufám že mi někdo řekne co je špatně(?)

pozn. Linux 64-bit, CodeBlock Project v c++ kompilovaný gcc

díky za to že se na to někdo podívá

CLib.h



typedef struct CStashTag {
int size; // Velikost každého prvku
int quantity; // Počet prvků (otázka: kde?)
int next; // ukazuje na další voloné místo (???)
// Dynamicky alokkované pole bajtu
unsigned char* storage; // Paměťové místo

} CStash;

void initialize(CStash* s, int size);
void cleanup(CStash* s);
int add(CStash* s, int index);
void* fetch(CStash* s, int index);
int count(CStash* s);
void inflate(CStash* s, int increase);


CLib.cpp


// Clib.cpp
// Implementační soubor vzorové knihovny v C

#include "CLib.h"
#include <iostream>
#include <cassert>
using namespace std;

// Počet prvk, které se mají přidat
// při požadavku na zvětšení alokované paměti
const int increment = 100;

// TATO FUNKCE NEVRACÍ HODNOTU
void initialize(CStash* s, int sz) {
s->size = sz;
s->quantity = 0;
s->storage = 0;
s->next = 0;
}



int add(CStash* s, const void* element) {
if(s->next >= s->quantity) // Zbývá dost místa?
inflate(s, increment);
// Kopírování prvku do paměti,
// začíná se na nejbližším volném místě:
int startBytes = s->next * s->size;
unsigned char* e = (unsigned char*)element;
for(int i = 0; i < s->size; i++)
s->storage[startBytes + i] = e[i];
s->next++;
return(s->next - 1); // Číslo indexu
}


// FUNKCE KTERÁ SLOUŽÍ K PŘÍSTUPU K DATŮM
void* fetch(CStash* s, int index) {
// Kontrola mezí pro indexování:
assert(0 <= index);
if(index >= s-> next)
return 0; // Indikace konce
// Vrací se ukazatel na požadovaný prvek
return &(s->storage[index * s->size]);
}

int count(CStash* s) {
return s->next; // Prvky v CStash
}

void inflate(CStash* s, int increase) {
assert(increase > 0 );
int newQuantity = s->quantity + increase;
int newBytes = newQuantity * s->size;
int oldBytes = s->quantity * s->size;
unsigned char* b = new unsigned char[newBytes];
for(int i = 0; i < oldBytes; i++)
b[i] = s->storage[i];
delete [](s->storage);
s->storage = b;
s->quantity = newQuantity;
}

void cleanup(CStash* s) {
if(s->storage != 0) {
cout << "uvolnění paměti" << endl;
delete []s->storage;
}
}


a CLibTest.cpp


#include "CLib.h"
#include <iostream>
#include <string>
#include <cassert>
using namespace std;



CStash intStash, stringStash;
int i;

int main() {

initialize(&intStash, sizeof(int));
for ( i = 0; i < 100; i++ ) {
add(&intStash, &i); //-- TADY TO HÁZÍ CHYBU
}

return 0;
}

Nahlásit jako SPAM
IP: 213.220.221.–
Reklama
Reklama
DooFy930
Stálý člen
1. 9. 2010   #2
-
0
-

Když víš co ti překladač hlásí tak chybu už opravíš sám ne?
To že je kód opsaný z knihy chybný je možné, tiskové chyby nejsou nic zvláštního.

EDIT: Kdyžtak napiš chybu překladače v originále...

Nahlásit jako SPAM
IP: 212.71.186.–
pidgin0
Návštěvník
1. 9. 2010   #3
-
0
-

In function ‘int main()’:|
CLibTest.cpp|14|error: invalid conversion from ‘int*’ to ‘int’|
CLibTest.cpp|14|error: initializing argument 2 of ‘int add(CStash*, int)’|
||=== Build finished: 2 errors, 0 warnings ===|

... asi neopravím:-/

pozn. když přesunu z CLibTest.cpp do CLib.cpp a nedávám to do samostatného souboru, tak to chybu při konverzi typů nehází(?)



CStash intStash, stringStash;
int i;
int main() {
initialize(&intStash, sizeof(int));
for ( i = 0; i < 100; i++ ) {
add(&intStash, &i);
}
return 0;
}

Nahlásit jako SPAM
IP: 213.220.221.–
crAzY^
~ Moderátor
+10
Grafoman
1. 9. 2010   #4
-
0
-

ta funkce přebírá int a ne ukazatel na int, čili:

add(&intStash, i);

Nahlásit jako SPAM
IP: 89.190.90.–
All you need is vision and time.
DooFy930
Stálý člen
1. 9. 2010   #5
-
0
-

int add(CStash* s, int index);

Tady má být podle definice funkce
int add(CStash* , const void* )

Nahlásit jako SPAM
IP: 212.71.186.–
pidgin0
Návštěvník
1. 9. 2010   #6
-
0
-

to jsem taky zkoušel, pak kompiler hlásí chybu

obj/Debug/CLibTest.o||In function `main':|
CLibTest.cpp|14|undefined reference to `add(CStashTag*, int)'|
||=== Build finished: 1 errors, 0 warnings ===|

Nahlásit jako SPAM
IP: 213.220.221.–
KIIV+42
God of flame
1. 9. 2010   #7
-
0
-

to jen proto ze si nepridal ten objektovej soubor co vyleze z CLib.cpp

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
pidgin0
Návštěvník
1. 9. 2010   #8
-
0
-

To DooFy93 : CHYBA při opisu:-O TRAPAS, promiňte a díky

Nahlásit jako SPAM
IP: 213.220.221.–
pidgin0
Návštěvník
1. 9. 2010   #9
-
0
-

soubor
CLib.h má vypadat



typedef struct CStashTag {
int size; // Velikost každého prvku
int quantity; // Počet prvků (otázka: kde?)
int next; // ukazuje na další voloné místo (???)
// Dynamicky alokkované pole bajtu
unsigned char* storage; // Paměťové místo

} CStash;

void initialize(CStash* s, int size);
void cleanup(CStash* s);
int add(CStash* s, const void* element); // tady bylo int add(CStash* s, int index); --> proto chyba konverze typů
void* fetch(CStash* s, int index);
int count(CStash* s);
void inflate(CStash* s, int increase);



snad se to někomu bude hodit takto přepsané, díky moc

Nahlásit jako SPAM
IP: 213.220.221.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 177 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý