Cocoa help
19 maart 2008 - 18:59   
geplaatst door: stijnschoor
Hallo

Laatst leek het me leuk om een programmaatje te schrijven om de verkoopberekeningen van mijn vader's bedrijf makkelijker te maken. Ik begon snel te typen tot ik bij een fout kwam.
Het punt is, als ik op de bereken knop druk sluit het programma zich af zonder ook maar iets te doen.
Kijk maar naar de code:


@implementation bereken
int inkoopprijs2;
int importkosten2;
int subtotaal;


- (IBAction)bereken:(id)sender
{
int inkoopprijs2 = [Inkoopprijs intValue];
int importkosten2 = [Importkosten intValue];
subtotaal = importkosten2 * inkoopprijs2;
[Winstmarge takeIntValueFrom: subtotaal];
}

@end

Kan iemand mij helpen?
:wacko:

(Bewerkt door stijnschoor om 17:44, 21-03-2008)

(Bewerkt door stijnschoor om 17:47, 21-03-2008)

"What's in a name that we call a mac"
Shakespeare
Cocoa help
19 maart 2008 - 20:32    reactie #1
geplaatst door: xjmaas
Ik ben zelf ook geen Cocoa goeroe, maar als je me het project mailt, dan zou ik er eens naar kunnen kijken.

Het lijkt erop dat je geen accessors e.d. gebruikt.

Doe je dit onder 10.4 of 10.5?

Cocoa help
19 maart 2008 - 20:52    reactie #2
geplaatst door: mennodeij
[cite]

int inkoopprijs2 = [Inkoopprijs intValue];
int importkosten2 = [Importkosten intValue];

[/cite]

Dit klopt niet. Je initialiseert hier twee lokale variabelen inkoopprijs2 en importkosten2 die de buiten de IBAction gedefinieerde variabelen "schaduwen". Je hoeft geen "int" voor de inkoopprijs2 en importkosten2 te zetten.

Het wordt dus:


- (IBAction)bereken:(id)sender
{
inkoopprijs2 = [Inkoopprijs intValue]; // geen "int" aan het begin.
importkosten2 = [Importkosten intValue];
subtotaal = importkosten2 * inkoopprijs2;
[Winstmarge takeIntValueFrom: subtotaal];
}
Vu-ja-dé: the odd feeling nothing has ever happened before...
Cocoa help
20 maart 2008 - 17:34    reactie #3
geplaatst door: stijnschoor
Bedankt voor de reacties. Het probleem is (helaas) nog niet opgelost. Misschien heeft de waarschuwing:
passing argument 1 of 'takeIntValueFrom:' makes pointer from integer without a cast,
hier iets mee te maken.
Ik zal nog even verder moeten zoeken :reading:
Maar toch bedankt voor de hulp.
 :shakehands:

(Bewerkt door stijnschoor om 22:22, 20-03-2008)

"What's in a name that we call a mac"
Shakespeare
Cocoa help
20 maart 2008 - 22:01    reactie #4
geplaatst door: nuance
Je moet setIntValue: gebruiken ipv takeIntValueFrom:
Cocoa help
21 maart 2008 - 08:59    reactie #5
geplaatst door: stijnschoor
Dit werkt helaas ook niet. Als ik setIntValue gebruik krijg ik alleen maar waarschuwingen. De knop doet het ook niet meer.
Maar toch bedankt
"What's in a name that we call a mac"
Shakespeare
Cocoa help
21 maart 2008 - 09:30    reactie #6
geplaatst door: TGV
Hoe stopt het programma? Er zijn onder XCode een paar manieren om dat te bekijken.
1. De Run Log, dat venster dat opent als je je programma vanuit XCode start met cmd-R of Build > Build and Run. Als je programma onverwacht stopt, staat daar meestal een foutmelding op de laatste regels.
2. De Debugger. Kies Project > Set Active Build Configuration > Debug en start het programma in de debugger (cmd-Y). Als je programma crasht, laat het debuggervenster zien waar dat precies gebeurt. Je kunt dan de stack bekijken en de waardes van de variabelen.

Een voor de hand liggende fout is dat je niet alle verbindingen correct hebt gemaakt in IB. Wijst  Inkoopprijs van het juiste document naar het goede veld? Is het wel van het type IBOutlet NSTextField* (idem voor de andere velden)? Heb je na de laatste wijziging van je document wel de .h class definitie in IB opnieuw ingelezen? Hangt de bereken-knop wel aan de bereken-action?

Wat betreft die dubbele declaraties: de beste manier om daarvan af te komen is de declaraties direct onder @implementation te verwijderen.

Wat betreft takeIntValueFrom:, dat moet inderdaad setIntValue zijn (mits Winstmarge van het juiste type is). Welke waarschuwingen krijg je trouwens?

Cocoa help
21 maart 2008 - 14:42    reactie #7
geplaatst door: stijnschoor
Ik heb het programma met de debugger gecontroleerd. Ik krijg de volgende foutmelding:


(gdb) run
warning: error on line 1433 of "/SourceCache/gdb/gdb-413/src/gdb/macosx/macosx-nat-inferior.c" in function "macosx_kill_inferior_safe": (os/kern) failure (0x5x)
[Switching to process 296 local thread 0x2707]
RunningÂ…
Program received signal:  "EXC_BAD_ACCESS".

Unable to disassemble objc_msgSend_rtp.
(gdb)

Ook als ik gcc via Darwin 8.0 gebruik krijg ik foutmeldingen.
Wat betreft de IBOutlets klopt alles, ik heb het meerdere keren nagekeken.
Nog een vraag; in de debugger is een vak met vreemde nummers en cijfers, is dit assembly?
In ieder geval bedankt.

"What's in a name that we call a mac"
Shakespeare
Cocoa help
21 maart 2008 - 15:13    reactie #8
geplaatst door: TGV
Je komt ergens midden in een bibliotheekroutine terecht. Die gekke codes kunnen adressen zijn of inderdaad assembly (bij assembly zie je korte afkortingen met een paar letters vaak gevolgd door wat getallen, zoals blz 0002 en leq r1,r3). Als je een paar stappen omhoog gaat kun je zien waar de fout door je eigen code werd aangeroepen.

Als je gdb in de terminal gebruikt, moet je dan met het commando "up" doen (totdat je een stuk van je eigen code herkent). Als je de debugger in XCode gebruikt, kun je linksboven de verschillende actieve functies kiezen. Kies dan de hoogste uit je eigen programma.

Cocoa help
22 maart 2008 - 08:31    reactie #9
geplaatst door: stijnschoor
Ik heb een voorbeeld van wat mijn programma moet worden gemaakt met Java. Dit is een test, niet het uiteindelijke programma

Prijsberekening:
http://stijnschoor.googlepages.com/dist.zip

(Bewerkt door stijnschoor om 21:16, 28-03-2008)

"What's in a name that we call a mac"
Shakespeare
Cocoa help
27 maart 2008 - 18:26    reactie #10
geplaatst door: stijnschoor
Eureka!  :thumbs-up:

Het is gelukt! :woot:
Ik gebruikte de verkeerde variabelen.


   IBOutlet NSTextField *Btw;
   IBOutlet NSTextField *Btw2;
   IBOutlet NSTextField *Importkosten;
   IBOutlet NSTextField *Inkoopprijs;
   IBOutlet NSTextField *Verkoopprijs1;
   IBOutlet NSTextField *Verkoopprijs2;
   IBOutlet NSTextField *Winstmarge;


Dit is de uiteindelijke code:


- (IBAction)bereken:(id)sender
{
inkoopprijs2 = [Inkoopprijs intValue];
importkosten2 = [Importkosten intValue];
subtotaal = importkosten2 * inkoopprijs2;
[Winstmarge setIntValue: subtotaal];
"What's in a name that we call a mac"
Shakespeare