Denna delen av 99 uppdateras inte längre utan har arkiverats inför framtiden som ett museum.
Här kan du läsa mer om varför.
Mac-nyheter hittar du på Macradion.com och forumet hittar du via Applebubblan.
morris

morris

Medlem
  • Registrerad 2002-11-07
  • Senast aktiv 2013-03-02
  • Antal inlägg 83

Foruminlägg

De senaste inläggen morris har skrivit i forumet.

Okej, jag har hittat problemet i alla fall. Jag ska inte kommentera allt för mycket på koden, för jag har inte själv läst boken du följer så jag antar att den bara går igenom språket Objective-C och inte Cocoa då. Till exempel ser jag att du ärver från Object istället för NSObject. Men som sagt, det spelar ingen roll i det här kontextet.

Problemet jag ser ligger i Rectangle -intersect:. Du allokerar en ny Rectangle, resultRect, som en instansvariabel till den Rectangle du intersectar. Sedan accessar du dess instansvariabel origin för att sätta x/y-koordinaterna. Problemet är att det inte finns någon origin i det läget. Instansvariabeln origin skapas bara i -setOrigin:, och den används inte här. En lösning är att flytta instansieringen av origin från -setOrigin: till -init, så att det alltid finns en origin. Här är en diff som illustrerar detta (+ är nya rader och - är borttagna rader om du inte är bekant med formatet):

--- Rektangel.old/Rectangle.m   2006-01-07 23:16:21.000000000 +0100
+++ Rektangel/Rectangle.m       2006-01-08 00:43:36.000000000 +0100
@@ -6,6 +6,15 @@
 @implementation Rectangle;

 //Setters
+
+- (id)init {
+        [super init];
+
+        origin = [[Point alloc] init];
+
+        return self;
+}
+
 -(void)setWidth: (float) w
 {
        width = w;
@@ -24,8 +33,6 @@

 -(void) setOrigin: (Point *) pt
 {
-       origin = [[Point alloc] init];
-
        [origin setX: [pt x] andY: [pt y]];

 }

Anledningen att du får så konstiga värden, det vill säga värdena för width och height, är lite invecklade. Normalt i Objective-C garanteras det att om man försöker skicka ett meddelande till nil så får man nil tillbaka. Således:

NSString *string = nil;
NSString *newString = [string copy];
unsigned int length = [newString length]

Vi skapar en variabel string som är nil, försöker kopiera den till newString som då blir nil eftersom meddelanden till nil returnerar nil. Vi försöker ta längden på newString som då blir 0. Det sista är lite intressant, för standarden säger bara att vi får objektet nil tillbaka, det säger ingenting om att vi ska få intvärdet 0 tillbaka. Just för intvärden råkar det då fungera, men för flyttalsvärden, som din float, fungerar det däremot inte. Vad du istället får tillbaka är det värde som råkade ligga på stacken just då, de flyttal du använde senast, nämligen height.

Kontentan är i alla fall att du ska passa dig för att ta flyttal från objekt som kan vara nil, för du kan få vad som helst tillbaka.

Till sist kan jag nämna att jag hittade felet genom att starta programmet i debuggern, och kolla alla instansvariabler i resultRect. Då märkte jag att resultRect->origin var nil.

Hör mer till CGI-bryggan än till Perl faktiskt, det är bara att PHP hanterar det här automatiskt åt dig. Du måste skriva din egen Content-Type-header för att Apache inte vet vad för sorts data ditt perlscript kommer kasta ur sig.

Det finns moduler som kan göra det åt dig, t ex CGI.

Du kan inte bygga en gcc från källkod utan en fungerade kompilator, tyvärr. Du måste installera en fungerande binär från OSX-skivan. Jag hade inte installerat från någon annan källa heller eftersom man då troligen inte får den Applespecifika gcc-versioner som distribueras med OS:et.

Om du inte gjorde några val under installationen av DevTools och du faktiskt körde från huvudpaketet, och du ändå bara har binären gcc2 som dessutom inte funkar, så har installationen gått fel. Du måste se till att få den installationen så rätt att du kan köra kommandot "gcc" från terminalen utan att få några felmeddelanden.

.inputrc används bara av bash (eller rättare sagt biblioteket readline, som bash använder), så det funkar nog inte med tcsh. Vet tyvärr inte vad man behöver i tcsh för att få till samma sak.

Låter ju väldigt lustigt. Har du möjlighet att lägga upp sourcen nånstans? I så fall kan jag kika på den.

Du installerade något i stil med "gcc2.95.pkg" då? Jag hade kört om DevTools-installationen och börjat med huvudfilen, den som heter "Developer Tools.mpkg" eller något liknande, sedan väljer du vilka underpaket du vill ha där. Jag har installerat gcc 4.0 och gcc 3.3, då ska du få gcc_select också. Om du vill bygga saker från terminalen behöver du "BSD SDK" också, men den ska vara förvald.

Du menar alltså att -y och -x från Point returnerar samma värden som -height och -width från Rectangle? Skulle väl kunna bero på att -intersect: helt enkelt skapar en ny Rectangle med felaktiga värden?

Ser att du kör med kommandot gcc2, som då motsvarar den äldre versionen 2.95.2. Någon speciell anledning till detta? Rekommenderad är gcc 4.0 på Tiger om jag minns rätt. 2.95.2 är något man måste kryssa i själv när man installerar DevTools, så detta kanske inte gått rätt. Kolla också kommandot gcc_select, som används för att växla mellan gcc-versioner. Kör "gcc_select -l" för att lista vilka som finns på ditt system.

När du säger "kommer inte åt", hur menar du då? Får du något felmeddelande från kompilatorn, fel i runtime eller blir värdet 0?

Var det allt som fanns i config.log? Ingen info längre fram, mer specifikt från när den testar gcc?

Ett alternativ är att du skapar ett testprogram, t ex:

int main(void) { return 0; }

och sparar i en fil "test.c", kompilera sedan denna med kommandot "gcc test.c". Om kompilatorn funkar ska du få ett program som heter "a.out" som inte gör något, annars får du felmeddelanden.

Du ska nog inte bry dig så mycket om VM-siffrorna. De inkluderar saker som minne som bibliotek använder, och är delade mellan flera processer. Det är kolumnen "Verkligt minne" du är intresserad av. Samma med "Inaktivt"/"Ledigt" där nere, räcker att du kollar på "Resident"/"Aktivt", bara det som egentligen används.

"C compiler cannot create executables" har inget med skrivrättigheter att göra, det är ett felmeddelande från configurescriptet att kompilatorn inte fungerar. Vad du kan göra för att få mer information är att öppna filen "config.log" i samma mapp och leta efter en rad ungefär "configure:1802: checking for C compiler default output file name", raderna efter den kommer förhoppningsvis innehålla felmeddelande från kompilatorn. Om du kan posta dem här kan jag kanske avgöra vad som är fel.

PATH ska du inte behöva bekymra dig om.

Ta bort /System/Library/PreferencePanes/Processor.prefPane om den nu stör dig så himla mycket, det skadar inte installationen. Anledningen att du inte får upp avinstallationsvalet är att den ligger i /System, som du normalt inte ska röra.

Om make inte hittas har du nog inte installerat DevTools ordentligt. Det ska ligga i /usr/bin/make och gcc ska ligga i /usr/bin/gcc, så det ska inte vara något strul med PATH. Om du är osäker, kör om DevTools-installationen och ändra inte defaultinställningar.

/Developer/Applications/Xcode.app