Zdravím Vás.
Potreboval by som pomoc s programom, ktorý som dostal ako zadanie v škole. Mám ho viac-menej hotový, ale mám tam jeden problém s polom. Keď som v ňom použil príkaz char, tak program funguje, ale nie celkom tak ako by mal, pri použití string, mi celý program padne. Na tomto odkaze http://www.ulozisko.sk/513546/Prog.rar sa program aj s podrobnejším vysvetlením nachádza.
Ďakujem za pomoc.
Fórum › C / C++
C++ POLE
minimalne michas iostream se stdio.h (pro jistotu jedes na implicitni deklarace funkce getchar())
pak si nepochopil princip indexu u c/c++ ... indexuje se od 0 !!!!!!!!!!!!!!!!!!!!!!!! string je objekt takze kdyz se pokusis o pristup na nesmyslny adrese, tak to prirozene spadne...
u retezcu char * to vubec nevadi.. ty si klidne prepisujou pamet kolem dokola az kam jim to dovoli system
Bez urážky, ale on nefunguje ani ten program s charem, hlavně proto, že tam nemažeš prázdný znaky po čtení cinovýho inputu, holt takový c++ sračičky který mi na něm trochu vadí. Jak zmínil KIIV nepochopils filozofii pole - počítá se od nuly, navíc si fakt nejsem jistej, zda jde v c++ vůbec 2D pole charových řetězců, spíš si myslím, žes udělal pole čtyř charů o délce 3, jestli mě neklame paměť. Chtělo by to pole struktur, navíc nejde porovnávat charový řetězec v ifu, alespoň mě to bez zkopnutí do stringu nikdy nefachalo.
Tento kód mi fungoval, ale nevím, zda jste se učili věci, co jsem tam použil, kdybys potřeboval něco vysvětlit, napiš
#include <iostream>
using namespace std;
#define MAX_DRUZ 2
#define MAX_VOJ 2
typedef struct Druzstvo{
char jmeno[MAX_VOJ][20];
} DRUZSTVO;
Druzstvo druzstvo[MAX_DRUZ];
string jm, jm2;
int main(){
for(int a=0; a<MAX_DRUZ; a++)
for(int b=0; b<MAX_VOJ; b++){
cout << "Vloz " << b+1 << " vojaka z " << a+1 << " druzstva: ";
cin.getline(druzstvo[a].jmeno[b], 20);
}
cout << "\n1. druzstvo\t2. druzstvo\n"; //edit podle poctu
for(int a=0; a<MAX_VOJ; a++){
for(int b=0; b<MAX_DRUZ; b++)
cout << druzstvo[b].jmeno[a] << "\t";
cout << endl;
}
cout << "Napis jmeno hledaneho vojaka: ";
cin >> jm;
cin.get();
bool found=false;
for(int a=0; a<MAX_DRUZ; a++)
for(int b=0; b<MAX_VOJ; b++){
jm2=druzstvo[a].jmeno[b];
if(jm==jm2){
cout << "Hledany vojak je v " << b+1 << ". v " << a+1 << ". druzstvu";
found=true;
}
}
if(!found)
cout << "Bud jste zadali spatne jmeno nebo se vojak nenachazi v zadnem druzstvu";
cin.get();
return 0;
}
Takže jestli jsem dobře pochopil, máš udělat matici 4x4 a jako prvky mají být "Vojak XY", kde to XY bude náhodný číslo od 1-99 a po naplnění matice zkoušet zadat "Vojak XY" a zkoušet ho vyhledat v matici a když tam bude, vypsat jeho pozici ?
Takto nějak?
#include <iostream>
#include <ctime>
#define SIRKA 4
#define VYSKA 3
using namespace std;
// slouzi jako parametr funkci
struct Army { char* vojaci[SIRKA][VYSKA]; };
// uchovava pozici [x,y]
struct Point
{
int x, y;
Point() : x(0), y(0) { }
Point(int x, int y) : x(x), y(y) { }
};
// vytvori armadu vojaku [4x3], kde jim prideli nahodne cislo 1-99
void createArmy(Army& army)
{
for (int x = 0; x < SIRKA; x++)
{
for (int y = 0; y < VYSKA; y++)
{
*(*(army.vojaci + x) + y) = new char[8];
char jmeno[8] = "Vojak";
char num[2];
itoa(1 + rand() % 99, num, 10);
strcat(jmeno, num);
strcpy(*(*(army.vojaci + x) + y), jmeno);
}
}
}
// dealokuje vojaky (jejich jmena)
void destroyArmy(Army& army)
{
for (int x = 0; x < SIRKA; x++)
{
for (int y = 0; y < VYSKA; y++)
{
delete[] *(*(army.vojaci + x) + y);
}
}
}
// vypise armadu vojaku (matici)
void printArmy(const Army army)
{
for (int x = 0; x < SIRKA; x++)
{
for (int y = 0; y < VYSKA; y++)
{
cout << *(*(army.vojaci + x) + y) << "\t\t";
}
cout << endl;
}
}
// hleda vojaka a vraci jeho pozici, pokud tam existuje
bool findSoldier(const Army army, const char* soldier, Point& point)
{
for (int x = 0; x < SIRKA; x++)
{
for (int y = 0; y < VYSKA; y++)
{
if (!strcmp(*(*(army.vojaci + x) + y), soldier))
{
point = Point(x, y);
return true;
}
}
}
return false;
}
int main()
{
srand((unsigned int)time(0));
Army army;
createArmy(army); // alokuje vojaky
printArmy(army); // vypise vojaky
char* find = "Vojak52"; // hledany vojak
Point point; // pozice, na ktere se nachazi hledany vojak
// vypise hledaneho vojaka
if (findSoldier(army, find, point))
{
cout << find << " = [" << point.x << "," << point.y << "]";
}
else cout << find << " nebyl nalezen";
destroyArmy(army); // dealokuje vojaky
cin.get();
return 0;
}
Testoval si to? Mě ten program neudělal nic, akorát slušně zamrznul. Navíc by mě zajímala jedna věc. Když uděláš pole charů třeba char pole[2][20]; znamená to, že jsem udělal pole dvou řetězců o maximální délce 20 nebo že jsem udělal 2 řádky po dvaceti neomezeně dlouhých řetězcích?
#10 Doomista
a proč bych to měl dělat a žrát tak paměť když to jde bez alokace? nikde v zadání neni, že je podmínka použít struktůru a hlavně se jedná o matici, nikoli pole a už vůbec ne cokoli lineárního
resp. jediný co alokuju je jméno, který je tak trochu nezbytný (je dynamický)
mám tam vše co je potřeba, pokud se tam voják nachází, tak vrací jeho pozici [x,y], kde Y je právě družstvo a X je jeho pozice v něm (1 až 3) ;)
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Razeni pole ktere v sobe ma dalsi pole podle hodnoty indexu — založil david
Zapsání generovaného čísla do pole a zapisování generovaných čísel d… — založil juraj111
Jak z "List<Integer> pole" uddelat normalni "int[] pole" — založil K4BlOs
Definice pole v C (jak použít pole uvnitř struct?) — založil oxidián
Odebrání prvku pole v C,problem s vypisem pole — založil Standa
Moderátoři diskuze