C++ malloc(): memory corruption problem

Permalänk
Medlem

C++ malloc(): memory corruption problem

Hejsan!

Jag arbetar på ett AI projekt och har nu helt plötstligt stött på ett besynnerligt problem. Jag deklarerar en medlemsvariabel av typen map<string,string> och får då (på ett helt annat ställe i koden som absolut inte har någonting att göra med denna variabel) ett run-time malloc(): memory corruption fel.

Variabeln används ingenstans ännu. Jag har provat med andra typer av variabler, bla. funkar char * test[10] och char [10] men inte string [10]. Det är som om programmet helt fått fnatt. Den hanterar hur bra som helst de gamla medlemsvariablerna, t.ex. en vector <AgentTrust> o.s.v.

Felmeddelandet ser ut som följande:

*** glibc detected *** ./game: malloc(): memory corruption: 0x0816d0c8 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xb7d3c1cd]
/lib/tls/i686/cmov/libc.so.6(malloc+0x7f)[0xb7d3d83f]
/lib/tls/i686/cmov/libc.so.6[0xb7d2b6af]
/lib/tls/i686/cmov/libc.so.6(fopen+0x2c)[0xb7d2b77c]
./game(_ZN13TiXmlDocument8LoadFileEPKc13TiXmlEncoding+0x69)[0x806ae79]
./game(_ZN13KnowledgeBase20readGoalsFromXMLFileEPKc+0x40)[0x805c6f0]
./game(_ZN13KnowledgeBase14initAttributesEPKcS1_+0x37)[0x805de77]
./game(_ZN13KnowledgeBaseC1EPKcS1_P13TiXmlDocument+0xac)[0x805e32c]
./game(_ZN5Agent14initAttributesEPKcS1_S1_S1_+0x68)[0x80578e8]
./game(_ZN5AgentC1Ev+0x56)[0x8057ca6]
./game(main+0x41)[0x8057531]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xdc)[0xb7cea8cc]
./game(__gxx_personality_v0+0xc1)[0x80573f1]

Jag har provat ominstallera gcc och g++ men det hälpte inte. Använder ubuntu.

Vad brukar dessa felmeddelanden bero på? Jag har varit med om memory fel förrut såklart men då har det varit fråga om en felanvändning eller oinitialiserade variabler. Men jag använder ju inte ens variabeln i fråga! Har någon någon lösning?

Cheers,

Anjovi

Permalänk
Avstängd

Fråga GOSH, han är C++ expert. Och han säger att minnesproblem och sånt, är inga problem. De är enkla att fixa. Säger han.

Permalänk
Medlem
Permalänk
Avstängd

Re: C++ malloc(): memory corruption problem

Citat:

Ursprungligen inskrivet av Anjovi
Vad brukar dessa felmeddelanden bero på? Jag har varit med om memory fel förrut såklart men då har det varit fråga om en felanvändning eller oinitialiserade variabler. Men jag använder ju inte ens variabeln i fråga! Har någon någon lösning?

Du har förmodligen skrivit över någon buffer, alltså om du endast deklarerat en variabel med en buffer på 10 tecken men skriver dit 11 tecken så har du skrivit över buffern och in på annat område.
Om inte kompilatorn ser detta eller du inte får varning i debug så är det en klart svår bugg och hitta eftersom den kan ge upphov till fel på ett helt annat ställe.

Det är en av de svåraste buggarna om man inte har bra debughantering och inte tänkt på detta när man programmerar

läste lite mer noga:
char * test[10] och char [10] men inte string [10].
du vet att det är ganska stor skillnad på dessa. om du även lägger in dem i en lista så undrar jag om du har riktig koll på vad du tänkt göra?

kan du skicka upp lite kod?

Visa signatur

Programmerare med C++ som huvudspråk.

Permalänk
Medlem

Jag hade inte överhuvudtaget tänkt använda någon string-array. Och ja, jag vet att det är en STOR skillnad på de där typerna! Jag menade inte att de är likadana på något sätt. Jag bara testade var felet satt. Det jag egentligen vill ha är en map <string,string>. Det är det jag absolut vill få att funka.

Detta är i stort min header-fil:

#ifndef KNOWLEDGEBASE_H
#define KNOWLEDGEBASE_H

#include <string>
#include <cstdlib>
#include <iostream>
#include <sstream>
#include <vector>
#include <map>
#include <ctype.h>
#include "cinterf.h"
#include "tinyxml.h"

using namespace std;

class KnowledgeBase
{
public:

KnowledgeBase ( );
KnowledgeBase (const char * goalFilename, const char * prologFunctionsFilename, TiXmlDocument * XmlConfig);
virtual ~KnowledgeBase ( );

void setVariable(string variableName, string value);
string getVariable(string variableName);

private:

TiXmlDocument mGoals;
TiXmlDocument * mpXmlConfig;
string mVariableStore[10]; // FUNKAR
string mVariableStoreee[2]; // FUNKAR EJ!!!

void initAttributes (const char * goalFilename, const char * prologFunctionsFilename);

};

#endif

Det finns många fler funktioner men de är irrelevanta i sammanhanget. Variabeln mVariableStore[10] funkar precis som den ska och används också av en del funktioner på ett bra sätt. mVariableStoreee[2] däremot krashar! Jag använder den inte alls och den finns inte nämnd på något annat ställe i koden än just i headerfilen. Ändå krashar programmet. Ändrar jag typ till t.ex. char * funkar det. Men som sagt, stringarrayer, vektorer eller maps funkar inte alls.

Det jag egentligen vill göra är att mappa användarens variabler (från XML kod) till ett värde som sedan kan användas (av användaren) senare i uträkningarna.

Permalänk
Avstängd

Har du CPP koden med (där det görs alltså)

vet att du inte frågade detta men jag kan inte låta bli och nämna variabelbenämningen, den är inte konsekvent vilket gör koden mer svårläst. inga problem med så här lite kod men öka bara lite så har man huvudvärk

kolla här
http://www.sweclockers.com/forum/showthread.php?s=&postid=728...

Visa signatur

Programmerare med C++ som huvudspråk.

Permalänk
Medlem

Naturligvis, tyvärr är den nästan 900 rader... inget man vill gå igenom om man inte är insatt i vad programmet. Den finns dock ute på:

www.student.itn.liu.se/~anjjo615/Exjobb/NewCode/src/Knowledge...

Det är mest genomgångar av XML dokument och olika anrop till XSB. Men variabeln används inte överhuvudtaget i cpp-filen än så länge. Ändå krashar det alltså.

Jag förstår inte vad som är så inkonsekvent med variabelbenämningarna. Jag använder en standardform med m för member och p för pointer, något som förespråkas av många C++ kodare. Själv gillar jag inte att kalla variabler för a_crszkvc30LastNameCol eller dylikt. Men det är väl en smaksak. Det har ju hur som helst ingenting med problemet att göra, eller hur? Håller dock med om att variabelnamn bör vara lättförståeliga och konsekventa, något jag ska arbeta på.

Som jag förstår beror ofta motsvarande fel på att man gjort något elakt med minnet tidigare i koden. Hmm... kommer att bli roligt att debugga, alltså.

____________________ SENARE ___________________________

Jag har hittat ett felet tror jag åtminstone. Jag har kört med char * i stället för strings när jag hanterar filnamn för vissa xmldokument. Det är här som minnet skrivits över. Nu använder jag strings i stället och det fungerar bättre, men fortfarande är det något fel någonstans.

Permalänk
Avstängd
Citat:

Ursprungligen inskrivet av Anjovi
Jag förstår inte vad som är så inkonsekvent med variabelbenämningarna.

Se det här som tips, alla väljer och koda som de vill givetvis men jag beskriver här vad som är inkonsekvent samt även ologiskt.

const char * goalFilename
goalFilename är en pekare men har inget "p", goal är med små bokstäver, vad är logiken i det?

Hade jag skrivit variabeln så hade jag skrivit så här
const char * pszFilenameGoal
Det är en pekare till en sträng av char som anger ett filnamn för något med "goal". En programmerare är i första hand intresserad av typen så den vet hur den skall jobba med variabel rent programmeringstekniskt. "goal" är mest för användaren som skall använda programmet.

TiXmlDocument * XmlConfig
Inget p och dessutom förstår man inte vad är för typ av objekt om man inte letar upp var det är deklarerat. Det skall alltid och gå och se direkt på variabeln så mycket som möjligt vad det är för typ av objekt. Detta för att få självdokumenterad kod.
Så här hade jag skrivit
TiXmlDocument* pTiXmlDocument
eller
TiXmlDocument* ptixmldocumentConfig

void setVariable(string variableName, string value)
Ena namnet har variable innan och det andra bara value, olika sätt och benämna

så här hade jag skrivit
void setVariable(string stringName, string stringValue)
Då ser du direkt vad det är för typ av variabel och även namnet

string mVariableStore[10];
detta är en vektor men det går inte och se, skall programmeraren använda variabeln så måste han leta upp deklarationen för att fatta hur den skall användas.
Bättre då att använda någon form av prefix för vektorer eller möjligen pekare
exempelvis
string m_astringVariableStore[10];
"a" står för array och string för det är en variabel av typen string
Personligen så föredrar jag och skriva m_ för medlemsvariabler eftersom m'et annars kan förväxlas med variabeltyp.

Tittat lite och hittade detta
"delete [] mVariableStore;"

varför kör du delete?

Visa signatur

Programmerare med C++ som huvudspråk.

Permalänk
Medlem

Kör delete för att det är en array... är inte så bra på minneshantering. Men nu funkar allt som det ska i alla fall. Tydligen är inte const char * så bra att använda sig av. hmm...

När det gäller namnkonventioner så ogillar jag variabelnamn som ser ut som

const char * pszFilenameGoal

Det gör mig mycket förvirrad. Ev. ett p innan pointers om de är members... men ja, det är ju upp till var och en. Jag har inte kodat enl. standard (med p alltså) i själva koden... bara headerfilen än så länge. Kommer till det sen. Jag har helt enkelt svårt för den stilen så jag har svårare att förstå variabelnamnen om det hänger en massa bokstäver framför. Ska ändra innan vidarförmedlar koden (om det nu händer).

(PS... åtminstone kallar jag inte någon variabel för "dude" som jag gjorde i ett tidigare projekt, he he...)

Permalänk
Avstängd
Citat:

Ursprungligen inskrivet av Anjovi
När det gäller namnkonventioner så ogillar jag variabelnamn som ser ut som

const char * pszFilenameGoal

Det där är ett övergångsproblem och jag tycker du skall ändra direkt (om du tänkt jobba lite mer med programmering).

Problemet är att man som icke programmerare tänker mer som vi gör i vardagen. Ser du en bil så tänker du bil, ser du en färg så tänker du på färgens namn kanske.
I vår verkliga värld så är det just typen, alltså en bil är en bil som man kan köra. en färg är en färg som beskriver utseende. Vet du typen på objektet så vet du även hur du kan använda det. Du vet direkt att man kan köra en bil.

Men om du benämner en variabel med bilVolvo så vet programmeraren ingenting. Hade den sett bilen på parkeringsplatsen så givetvis men nu är det ett objekt i koden vilket är en helt annan sak. Vad syftet för dig som programmerare är med namnet, det är just och förklara hur variabeln kan användas.

Står det psz (en standard för charbuffer) så vet programmeraren direkt hur den kan jobba med variabeln. Du behöver inte förklara för andra hur du tänkt och vad som är vad.

angående delete på det dära så skall man inte köra delete på något som man inte gjort "new" på. Variabeln kommer skapas upp med automatik och även raderas med automatik så du behöver inte köra delete.

såg detta med:
--------------------------
/**
* A nonsense function that can be used to try different things.
*/
void KnowledgeBase::debugFunc() {
TiXmlDocument returnDocument;
TiXmlElement * root = new TiXmlElement("root");
returnDocument.LinkEndChild(root);

TiXmlDocument origDocument;
TiXmlElement * root2 = new TiXmlElement("root");
origDocument.LinkEndChild(root2);
TiXmlElement * object = new TiXmlElement("object");
TiXmlElement * position = new TiXmlElement("position");
TiXmlElement * sings = new TiXmlElement("sings");

object->SetAttribute("id","@1");
object->SetAttribute("type","@2");

position->SetAttribute("x","@3");
position->SetAttribute("y","@4");

/*sings->SetAttribute("id","@1");
sings->SetAttribute("song","Amazing");
*/
object->LinkEndChild(position);
root2->LinkEndChild(object);
// root2->LinkEndChild(sings);

origDocument.Print();

char * xsbQueryTest = "object(CC,BB), position(CC,G,H).";
if (!xsb_query_string(xsbQueryTest)) {
int i = 1;
xsb2xml(root2,root,i);

}
xsb_close_query();

clearVariableStore();
}
-------------------------
Nu vet jag inte om de objekten som du sänder över pekarna till hanterar radering av dem men om de inte gör det så läcker det minne ordentligt där. ser att det är en debugfunktion men viktigt och göra rätt i alla.

Visa signatur

Programmerare med C++ som huvudspråk.

Permalänk
Medlem

Ok! Tack för tipsen! Trist att det finns lite väl många "standarder" Det skulle vara bra om alla använda samma och att de lärde ut det i kurser. Roligt att väldigt få tutorials använder sig av sådana standarder. Oftast använder de sig av ptrVariabelNamn stilen har jag märkt. eller strVariabelNamn. Den stilen är åtminstone lättare för MIG att läsa men det är ju en smaksak kanske. Skulle hellre se ett namn som är av formen ptrStringVariabelNamn eller ptrstrVariabelNamn än pszVariabelNamn. Men, men... vi får se vad jag tycker i framtiden. Jag är ju inte hardcore programmerare och har inte tänkt bli en heller utan snarare vill jag kunna programmera för att lösa de problemställningar jag har inom olika områden.

Permalänk
Medlem

Nu är jag kanske inte rätt person att läxa upp dig och jag har inte sett koden men:

Citat:

Ursprungligen inskrivet av gosh

Hade jag skrivit variabeln så hade jag skrivit så här
const char * pszFilenameGoal
Det är en pekare till en sträng av char som anger ett filnamn för något med "goal".

Skall det inte vara prgbFilenameGoal? Eftersom att char egentligen är en array(rg) som innehåller bytes(b). sz är ju "zero-terminated string".

Citat:

Ursprungligen inskrivet av gosh

Bättre då att använda någon form av prefix för vektorer eller möjligen pekare
exempelvis
string m_astringVariableStore[10];
"a" står för array och string för det är en variabel av typen string

Varför inte m_arstrVariableStore? Eftersom array=ar och string=str?

Om det nu är Hungarian Notation man använder sig av.
http://en.wikipedia.org/wiki/Hungarian_notation

Visa signatur

E6300 | Thermalright Ultra-120 eXtreme + Noctua 120mm 1200rpm | Gigabyte GA-965P-DS3 | 3GB Corsair XMS2-6400 CL5

Permalänk
Medlem

Fråga angående minneshantering... om man har följande funktion:

AgentTrust * agentTrust = getAgentTrustStruct(agentID);
if (agentTrust) {
return agentTrust->dependability;
}
else {
// Standard value for trust if unknown.
return 0.0;
}

blir det då minnesproblem då agentTrust inte raderas? Ska man lösa det med något dylikt:

AgentTrust * agentTrust = getAgentTrustStruct(agentID);
if (agentTrust) {
float fff = agentTrust->dependability;
delete agentTrust;
return fff;
}
else {
// Standard value for trust if unknown.
return 0.0;
}

Jag tycker det blir onödigt knöligt... :/

Permalänk
Avstängd
Citat:

Ursprungligen inskrivet av Anjovi
Ok! Tack för tipsen! Trist att det finns lite väl många "standarder" Det skulle vara bra om alla använda samma och att de lärde ut det i kurser. Roligt att väldigt få tutorials använder sig av sådana standarder.

Det finns många som kodar som en potta skit. Läs exempelvis matematiker som visar hur man löser matematiska problem programmeringsmässig. De brukar lyckas med och skriva 10 helt oläsliga rader kod som dessutom är korta.

sunkBurk Exakt hur man väljer och benämna variabler är lite upp till programmeraren, det viktiga är att man är konsekvent.

Men en superviktig sak och tänka på:
- Det är lättare och komma ihåg en regel jämfört med tio regler

Varför inte m_arstrVariableStore? Eftersom array=ar och string=str?

"ar" är två bokstäver, varför måste man ha två, går det och förkorta eftersom en bokstav är lättare och komma ihåg jämfört med två
"str" är tre bokstäver. Om du har en annan strängklass som heter CString eller varför inte wstring (unicode versionen). hur skall man veta vad "str" är för typ av string objekt.
Dessutom är string objekten objekt som alla andra objekt. varför förkorta detta objektet och kanske inte andra eller skall alla objekt förkortas?

Då är det enligt mig bättre och skapa få regler som är lätta och komma ihåg och beskriver mycket.
skriv exempelvis ut hela objektnamnet i små bokstäver och sedan kommer variabelbenämningen. detta är en enda regel som löser alla objekt

Visa signatur

Programmerare med C++ som huvudspråk.

Permalänk
Medlem

Nu ska jag lägga mig i diskussionen. Ska sätta upp lite regler som jag tycker fungerar bra och hålla mig till dom. Tack för hjälpen!

Permalänk
Avstängd
Citat:

Ursprungligen inskrivet av Anjovi
Fråga angående minneshantering... om man har följande funktion:

AgentTrust * agentTrust = getAgentTrustStruct(agentID);
if (agentTrust) {
return agentTrust->dependability;
}
else {
// Standard value for trust if unknown.
return 0.0;
}

blir det då minnesproblem då agentTrust inte raderas? Ska man lösa det med något dylikt:

AgentTrust * agentTrust = getAgentTrustStruct(agentID);
if (agentTrust) {
float fff = agentTrust->dependability;
delete agentTrust;
return fff;
}
else {
// Standard value for trust if unknown.
return 0.0;
}

Jag tycker det blir onödigt knöligt... :/

Om den funktion som returnerar pekaren gjort så att mottagaren måste radera den så är det extremt dåligt kodat. Förmodligen är det någon java-nisse eller C# kodare som skrivit funktionen i C++, de skickar objekt lite hur som helst för de behöver inte bry sig om hur objekten raderas. Det inbjuder till slarvig programmering.

Normalt sett så försöker du alltid para ett "new" med ett "delete". ser du inget "new" så behöver du heller inte köra något "delete".

Har du grävt en grop med "new" så måste du täppa igen den med "delete" men gräver du ingen grop så behöver du heller inte täppa igen den

Visa signatur

Programmerare med C++ som huvudspråk.

Permalänk
Medlem

prövat att använda valgrind ??

Visa signatur

weeeee

Permalänk
Medlem

Oki dookie! Nu är det faktiskt jag som skrivit just den funktionen men det vara bara ett exempel. Jag använder ju mig av en hel del libraries! Åh, på tal om det, bästa programmerings anti-standarden någonsin:

Jag använder mig av XSB (Prologbaserat logikspråk för AI) och i deras interface till C så har de gjort så att om en query lyckas så returneras false annars true!! Samma för deras next() funktioner! Blir jobbigt att läsa koden:

if (!xsb_query(...)) {
while (!xsb_next()) {
....
}
}

Hah! Den mest omgjorda definitionen av booleans jag sett.

mounte - ja!! Det var så jag fick reda på var felet låg! Underbart program om dock en aning avancerat för de som inte är 100% insatta i minneshanteringsvärlden.

Permalänk
Avstängd
Citat:

Ursprungligen inskrivet av Anjovi

Jag använder mig av XSB (Prologbaserat logikspråk för AI) och i deras interface till C så har de gjort så att om en query lyckas så returneras false annars true!!
Hah! Den mest omgjorda definitionen av booleans jag sett.

hmmm, kanske inte smartaste sättet.. använder man sig av olika bibliotek och de har lite egenheter för sig så skall man vara väldigt noga med om det faktiskt är värt. ok det fungerar säkert och använda för en labb men skall man göra en applikation som senare används av andra så måste man vara mycket noga med att kvaliteten är bra. minsta lilla samtidigt som man har dåliga möjligheter och själv rätta så strunta i det och koda själv även om det kan innebära lite extra tid

Visa signatur

Programmerare med C++ som huvudspråk.

Permalänk
Glömsk
Citat:

Ursprungligen inskrivet av mounte
prövat att använda valgrind ??

Detta rekommenderar jag också. Valgrind är duktig på att hitta minnesläckor. Kompilera in debuginfo (-g) i ditt program och kör valgrind --leak-check=yes dittprogram

Visa signatur

...man is not free unless government is limited. There's a clear cause and effect here that is as neat and predictable as a law of physics: As government expands, liberty contracts.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av gosh
Förmodligen är det någon java-nisse eller C# kodare som skrivit funktionen i C++, de skickar objekt lite hur som helst för de behöver inte bry sig om hur objekten raderas.

Haha, du är inte på riktigt? Det finns programmerare som är skickliga nog att anpassa sig efter språken.

Permalänk
Avstängd
Citat:

Ursprungligen inskrivet av Loopback
Haha, du är inte på riktigt? Det finns programmerare som är skickliga nog att anpassa sig efter språken.

Nej jag är inte på riktigt

Självklart finns det javakodare som kan koda bra men deras språk har inbyggd hantering för pekare så programmeraren behöver aldrig tänka på det. I C++ är det i praktiken omöjligt och slarva med pekare eftersom det inte blir så många rader innan man inte har kontroll på koden.

C++ tvingar programmeraren till och skärpa sig, medan andra språk är mer förlåtande.

Visa signatur

Programmerare med C++ som huvudspråk.

Permalänk
Medlem

Jag har inget val i frågan att använda XSB. Det är INTE för min labb, utan för mitt examensarbete. XSB är synnerligen komplixerat och det är inget man slänger ihop något eget för i första taget. Annars fungerar interfacet bra hittills, och det förenklar logik och agentens minne något otroligt. Först var jag tveksam till att använda XSB eller något annat Prologbaserat för övrigt, men det visade sig vara mycket användbart! Min examinator har dessutom en förkärlek för XSB och känner de som utvecklar språket så det är lite av ett "krav" för mig. Men som sagt, det funkar utmärkt förrutom att vissa funktioner returnerar lite konstiga saker mot vad man förväntat sig.

Jag gillar C++ på många sätt och jag förstår att pekare är användbara men jag kan ändå inte komma ifrån hur himla mycket smidigare Java och C# är i jämförelse. Det absolut jobbigaste med C++ är att det känns som om alla libraries som finns är ett hop-plock från de sista 15 åren skrivna av smarta men ljusskygga källarnördar som alla ignorerar dokumentation. OK, OK, jag vet att detta är en stor överdrift, men tänk t.ex. på att det inte finns något enkelt och bra sätt att bara visa upp en enkel bild i C++ utan att använda sig av något utomstående bibliotek. Eller finns det? Jag har då inte hittat något än så länge i alla fall. Heh, nå, smaken är som baken. Ett tankvärt citat dock:

"Now, some folks on the Internet put their faith in C++.
They swear that it’s so powerful, it’s what God used for us.
And maybe it lets mortals dredge their objects from the C.
But I think that explains why only God can make a tree.
For God wrote in Lisp code
When he filled the leaves with green.
The fractal flowers and recursive roots:
The most lovely hack I’ve seen."

Permalänk
Avstängd

Anjovi: Jag kollade de där funktionerna som du nämnde och returnerade bool, vad jag såg så returnerade de en int. Och det är faktiskt bra för då kan man returnera mer information om vad som är felet. Returneras 0 så går allt perfekt. Returneras ett possitivt nummer så har det gått bra men man bör vara vaksam. Returneras ett negativ nummer så har det ballat ur och man kan ibland se vad som gått fel genom att tolka vilket nummer som returnerades. Ofta brukar de iofs ha makron för att kolla om funktionen gick bra eller ej och då blir det mer lättläst med.

Angående lib till C++:
C++ är inte gjort för att man skall använda sig av andra lib i första hand, det är gjort för att göra egna program och då det mesta av jobbet själv.
Det är få som gör lib i java eller C# dels på grund av att de själva har ett mastodontlib som följer med och de språken är inte gjorda för att man skall koda lika mycket själv som exempelvis C++.

C++ försöker göra det möjligt för kodaren och göra snabbast möjliga kod med maximal frihet.
En lat programmerare kommer och hata C++.
Men att vara lat är jobbigt, vet inte om du spelat squash någon gång men om du gjort det och försöker vila lite så märker du snabbt att du får springa mycket mer eftersom den andre då kan spela ut dig. Samma sak med programmering, att vara lat programmerare straffar sig väldigt snabbt.

Vad du tjänar på java och C# är att du kommer igång snabbare och har något och visa upp. Möjligen behöver du inte skriva lika mycket kod (vilket man oftast behöver efter ett tag).
C++ har en helt annan utvecklingscykel. ofta märks inget i början, folk kanske undrar varför inget händer som inte är med och progammerar. Detta beror på att C++ programmerarna då bygger upp sina egna lib/klasser och annat som designen är beroende av. I C++ måste man i princip alltid börja med att skapa funktionalitet för datat, inte designen på applikation medan man ibland gör tvärtom i andra språk. När det gått ett tag i projektet så börjar C++ programmet ta fart, det går ofta snabbare och snabbare för en utomstådende med de som kört motsatt teknik (börjat med design) tappar fart efter ett tag.

Det som är jobbigt med programmering är inte att att skriva kod, det jobbiga är att få bra struktur (eller rättare sagt så om man inte fått till strukturen så är det väldigt jobbigt) så man kan lägga till funktionalitet eller snabbt förändra. Även att programmera buggfritt.
För en van C++'are är detta inga större problem men för en ovan så kan det vara väldiga problem

Visa signatur

Programmerare med C++ som huvudspråk.

Permalänk
Medlem

Jo, jag vet att de returnerar int, vilket som du säger är bra för att man får reda på vad som händer/inte händer. Men det ser ändå ruskigt lustigt ut att man skriver (och så skriver de också) if (!xsb_next)...

Jag anser det inte så mycket vara en fråga om lathet utan snarare att man måste göra så otroligt mycket mer innan man överhuvudtaget kommer till den faktiska uppgiften man försöker lösa. Det är som att uppfinna hjulet om och om igen. Visst, man lär ju sig hur hjulet funkar men det visste man ju i alla fall. Och det är trevligt att kunna ta en taxi utan att behöva uppfinna hjulet, växellådan, motorn, för att inte tala om att lära taxichauffören köra. Om man måste uppfinna allt så kommer man aldrig fram till flygplatsen i tid. Smaksak kanske, men jag vill få saker gjort inom en viss tid och ska man skriva om saker som andra också ha varit tvugna att skriva om varenda gång så blir det ju en aning ineffektivt enligt min mening. Men det är ju olika hur man är funtad. Jag känner folk som ÄLSKAR Assembler för att det är ger en total kontroll. Jag föredrar dock språk där jag itne bhöver koda i en timme för att få programmet att räkna från ett till tio.

Håller helt klart med dig angående strukturen på program. Det är där det svåraste ligger!! Speciellt om uppgiften är ganska abstrakt och lite svår att dela upp på något självklart sätt... ickigt!

Permalänk
Avstängd
Citat:

Ursprungligen inskrivet av Anjovi
Jo, jag vet att de returnerar int, vilket som du säger är bra för att man får reda på vad som händer/inte händer. Men det ser ändå ruskigt lustigt ut att man skriver (och så skriver de också) if (!xsb_next)...

Japp helt klart är "if (!xsb_next)" dåligt skriven kod men det är ändå bra att man ser det och faktiskt förstår att det är illa skrivet. I Windows så använder man ofta något som kallas för HRESULT vilket igentligen är en "long" och då finns två makron FAILED och SUCCEEDED

Du kan exempelvis skriva if( SUCCEEDED( xsb_next() ) ) { ... } vilket är mycket tydligare.

Skall man göra labbar eller små testprogram så är C++ ingen hitt. Men när man gör program för att större användande så krävs det en hel del jobb. Skulle exempelvis de som gör Photoshop, AutoCAD, Visual Studio, Word eller något annat program förlita sig på lib som olika gjort då hade de garanterat fått problem. Dessa företag har med all sannolikhet byggt upp deras egen generella kodbas som just passar deras program.

Skriv ett eget macro
#define SUCCEEDED(returnvalue) ((returnvalue) >= 0)

Visa signatur

Programmerare med C++ som huvudspråk.