Du bist nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: OS X Entwicklerforum. Falls dies dein erster Besuch auf dieser Seite ist, lies bitte die Hilfe durch. Dort wird dir die Bedienung dieser Seite näher erläutert. Darüber hinaus solltest du dich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutze das Registrierungsformular, um dich zu registrieren oder informiere dich ausführlich über den Registrierungsvorgang. Falls du dich bereits zu einem früheren Zeitpunkt registriert hast, kannst du dich hier anmelden.

1

Freitag, 30. März 2012, 11:54

NSMutableArray. kein Ausgabewert

Hallo liebe OS Gemeinde,

Bei folgendem Code habe ich ein Problem mit der Ausgabe:

Ich deklariere in der h.Datei ein MutableArray und impementiere ordentlich eine Synt-Anweisung.

Nun soll in einem UISwitch nix andere gemacht werden, wie das Array in einem bestimmten Index mit Zahlen-Werte zu füllen.
Bei Switch1 im index 0 mit Wert1
Bei Switch2 im index 1
usw.

Hab mir dazu folgenden Code ausgedacht:

Quellcode

1
2
3
float switchOn0;
    	NSNumber *numberSwitchOn0 =[contentsExtraEuro objectAtIndex:0];
    	switchOn0=[numberSwitchOn0 floatValue];


Nun fülle ich das Array mit Nullwerten (Hab ich bei Appel-Dev gelesen, dass es Empfehlenswert ist)
und ersetze den NULL-Wert in index 1 mit dem Wert den ich haben möchte. Dieser wurde zuvor über ein anderes Array ausgelesen.

Quellcode

1
2
3
4
5
for (int i=0;i<10;i++) {
        	[inTakeTheSwitches addObject:[NSNull null]];
    	}
    	
    	[inTakeTheSwitches replaceObjectAtIndex:0 withObject:numberSwitchOn0];


Gebe ich nun über die Konsole den Wert aus, erscheint NULL

Quellcode

1
NSLog(@"Array: %@", [inTakeTheSwitches objectAtIndex:0]);


Hab ich mir nun ein totalen Blödsinn überlegt? Gebe ich für die Konsolenausgabe den Wert aus der NSNumber direkt ein, funktioniert es. Also muss es folgerichtig an meinem Array liegen.

Beste Grüße
Jorgo

Beiträge: 339

Wohnort: Thüringen

Beruf: arbeitsam

Hobbys: mein iMac, Mountainbiking, Fotografieren

  • Private Nachricht senden

2

Freitag, 30. März 2012, 13:35

du musst für den MutableArray noch Speicher reservieren mit alloc init ;) und noch besser vielleicht, da er nur 2 Werte enthalten soll mit alloc initWithCapacity
[window close]

3

Freitag, 30. März 2012, 15:04

du musst für den MutableArray noch Speicher reservieren mit alloc init ;) und noch besser vielleicht, da er nur 2 Werte enthalten soll mit alloc initWithCapacity

Danke dir uniique,

dachte das mach ich schon beim Erzeugen meines Objektes in der h. Datei.

Beiträge: 1 496

Wohnort: Kölle

Beruf: Schüler

Hobbys: Handball

  • Private Nachricht senden

4

Freitag, 30. März 2012, 15:33

ne da wird es nur deklariert
Gruß

Robin

5

Freitag, 30. März 2012, 21:55

Danke euch. Funktioniert.

Nun möchte ich die Zahlen aus dem Array auslesen und zusammenzählen.
Da sie zuvor mit NULL gefüllt worden sind ergibt sich folgendes Problem.
Hab mir diesen Code zusammen gebastelt:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
NSNumber *temp;
    	NSNumber *spam;
    	float temp1;
    	float temp2=0;
    	
    	//Array auslesen
    	for(int i = 0; i < 10; i++)
    	{
        	
        	if ([[inTakeTheSwitches objectAtIndex:i]isEqual:NULL]) {
            	spam=[inTakeTheSwitches objectAtIndex:i];
        	}
        	else if ([inTakeTheSwitches objectAtIndex:i]!=NULL) {
            	temp=[inTakeTheSwitches objectAtIndex:i];
            	temp1=[temp floatValue];
            	temp2=temp1+temp2;
            	temp1=0;
        	} 
                    	
    	
        	
        	
        	
       	
    	}


Beim Ausführen meldet der Compiler dass ich keine NULL-Werte in Float wandeln darf/kann. Problem verstanden. Aber was hab ich falsch gemacht.

6

Samstag, 31. März 2012, 15:15

Überlege mal, Du füllst das Array mit

[NSNull null]

und vergleichst dann aber mit

NULL

Ergibt das einen Sinn? Ersteres ist ein Objekt, NULL ist das nicht.

Michael

7

Samstag, 31. März 2012, 15:55

Überlege mal, Du füllst das Array mit

[NSNull null]

und vergleichst dann aber mit

NULL

Ergibt das einen Sinn? Ersteres ist ein Objekt, NULL ist das nicht.

Michael

Du hast natürlich recht. Das macht kein Sinn. Habe es nun folgendermaßen gelöst:

Quellcode

1
2
3
4
//Wert in Array aufnehmen
	for (int i=0;i<11;i++) {
    	[inTakeTheSwitches addObject:@"0"];
	}


Dann lese ich aus einem anderen Array ein Wert aus, und packe es in eine NSNumber dessen Wert ich nun in meinem Array ersetze:

Quellcode

1
2
3
 NSNumber *numberSwitchOn0 =[contentsExtraEuro objectAtIndex:0];

 [inTakeTheSwitches replaceObjectAtIndex:0 withObject:numberSwitchOn0];


Nun wird das Array ausgelesen und die Werte addiert. ZUm Schluss in der KOnsole kontrolliert und in einem Label mit dem Zusatz Euro ausgegeben:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
NSNumber *temp;
    	float temp1;
    	float temp2=0;
    	
    	//Array auslesen
    	
    	
    	for(int i = 0; i < 10; i++)
    	{
            	temp=[inTakeTheSwitches objectAtIndex:i];
            	temp1=[temp floatValue];
            	temp2=temp1+temp2;
            	temp1=0;
        	} 
    	
    	NSLog(@"Array: %@", [inTakeTheSwitches objectAtIndex:0]);   
    	NSLog(@"ArrayGes: %1.2f", temp2);
    	
    	NSString *switchInEuro= [NSString stringWithFormat:@"%1.2f",temp2];
    	NSString *switchInEuro1 = [switchInEuro stringByAppendingString:@" Euro"];
    	
    	[outputZusatzEuro setText:switchInEuro1];


Das ist das was ich mir selber überlegt habe. Bestimmt ist das für euch Profis umständlich. Hoffentlich blamiere ich mich hier nicht :S

8

Samstag, 31. März 2012, 16:23

Mir ist zwar nicht klar, warum Du das Array erst mal mit Dummy Werten füllst, aber das lass ich jetzt einfach mal so stehen. Nur, wenn Du das schon tust und das Array später dann mit NSNumber Objekten versiehst, warum nimmst Du dann als Dummy Wert nicht auch ein NSNumber Objekt? Deine Schleife funktioniert ja nur, weil NSString auch die Nachricht floatValue versteht. Das kann bei einem anderen Anwendungsfall, wo Du eine andere Methode für die „richtigen“ Objekte verwendest dann in die Hose gehen. Im übrigen kannst Du Zeile 13 weglassen und die Zeilen 19 und 20 zusammenfassen zu:

Quellcode

1
NSString *switchInEuro = [NSString stringWithFormat:@"%1.2f Euro", temp2];

Michael

9

Samstag, 31. März 2012, 19:38

Hallo Michael,

danke für Deinen Tipp. Wieder etwas gelernt.

Ich habe bei Apple gelesen, dass es sinnvoll ist das Array entweder mit mit 'initWithCapacity' die anzunehmende Kapazizät anzugeben, oder das Array zuvor mit Werten zu füllen.

Was ich halt nicht mache, ist irgendein Code den ich im Internet finde nachzumachen, sondern vielmehr mir selber Gedanken zu machen und nach meinem Verständnis zu Programmieren. Das ist auch der Grund weshalb ich ab und an nachfrage ob das so Sinn macht. Bin dann natürlich sehr dankbar für die Tipps. So lerne ich richtig mit OC umzugehen.

Viele Grüße
Jorgo
Mir ist zwar nicht klar, warum Du das Array erst mal mit Dummy Werten füllst, aber das lass ich jetzt einfach mal so stehen. Nur, wenn Du das schon tust und das Array später dann mit NSNumber Objekten versiehst, warum nimmst Du dann als Dummy Wert nicht auch ein NSNumber Objekt? Deine Schleife funktioniert ja nur, weil NSString auch die Nachricht floatValue versteht. Das kann bei einem anderen Anwendungsfall, wo Du eine andere Methode für die „richtigen“ Objekte verwendest dann in die Hose gehen. Im übrigen kannst Du Zeile 13 weglassen und die Zeilen 19 und 20 zusammenfassen zu:

Quellcode

1
NSString *switchInEuro = [NSString stringWithFormat:@"%1.2f Euro", temp2];

Michael

10

Freitag, 4. Mai 2012, 00:19

Hallo

ich wollte kein neues Thema eröffnen, weil mein neues Problem mit diesem wohl zusammenhängt.

Folgendes:
Ich parse ein XLM-File und hole mir meine Daten mit folgendem Code:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for (int i=0;i<rows;i++) {
    	
    	Daten *aDaten = [appDelegate.datenWerte objectAtIndex:i];
    	NSString *datenAbgleichBasicService = [[NSString alloc]initWithString:aDaten.basic];
    	NSString *datenAbgleichBasicEuro = [[NSString alloc]initWithString:aDaten.basicEuro];
    	NSString *datenAbgleichExtraService = [[NSString alloc]initWithString:aDaten.extra];
    	NSString *datenAbgleichExtraEuro= 	[[NSString alloc]initWithString:aDaten.extraEuro];
    	
    	//Innherhalb der Schleife das Array mit den Werten füllen aus den XLS Daten
    	[importContentsBasisServiceArray replaceObjectAtIndex:i withObject:datenAbgleichBasicService];
    	[importContentsBasisEuroArray replaceObjectAtIndex:i withObject:datenAbgleichBasicEuro];
    	[importExtraServiceArray replaceObjectAtIndex:i withObject:datenAbgleichExtraService];
    	[importExtraEuroArray replaceObjectAtIndex:i withObject:datenAbgleichExtraEuro];
   
	}


Zur weiterverarbeitung werden die Daten in einer Tabelle und auch Labels ausgegeben. Das klappt alles wunderbar. Möchte ich allerdings die Zahlenwerte (contentsBasisEuroArray) zu weiteren Berechnungen nutzen oder mit einem Formatter formatieren bekomme ich immer nur als Ergebniss "0". Ich lese einen Arrayinhalt in ein NSNumber und konvertiere anschließend in Float (temp=[nsNumberwert floatValue]). Geht alles nicht. Wo liegt nur mein Fehler. Ich denke in meinem initWithString import. Aber wie löse ich das schlauer?

Beiträge: 6 394

Wohnort: Herdecke

Beruf: Selbständig

Hobbys: Gleitschirmfliegen, RC-Helikopter, Faustball

  • Private Nachricht senden

11

Freitag, 4. Mai 2012, 08:07

Wenn du einen string reinschreibst kannst du wohl schlecht eine number rausholen. Du must einen string auslesen und den konvertieren zu int.

BTW. Lies dir mal was durch zu dem Stickwort Convenience-Allocator.

Gruß

Claus
Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)

12

Freitag, 4. Mai 2012, 10:00

Danke für deine Antwort,

ja das verstehe ich schon. Nur, wenn ich die Daten statt aus einer XLS-Datei anhand einer normalen txt auslese funktioniert es problemlos. Ich habe schon versucht den String zu konvertieren. Da ich float benötige habe ich es natürlich auf diesem Wege auch schon versucht

Beiträge: 6 394

Wohnort: Herdecke

Beruf: Selbständig

Hobbys: Gleitschirmfliegen, RC-Helikopter, Faustball

  • Private Nachricht senden

13

Freitag, 4. Mai 2012, 10:06

NSString *eurostr=[importContentsBasisEuroArray objectAtIndex:0];
float euro=[eurostr floatValue];

muss gehen, sonst ist Dein array kaputt

Gruß

Claus
Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)

14

Freitag, 4. Mai 2012, 10:19

Geht leider immer noch nicht. Mit der ersten Variante hatte ich es ja schon seit einiger Zeit versucht. Ich habe schon öfters Werte konvertiert und nie Probleme gehabt. Schau mal:

Quellcode

1
2
3
4
5
NSString *eurostr=[importContentsBasisEuroArray objectAtIndex:0];
	float euro=[eurostr floatValue];
	
	NSLog(@"Erg: %1.2f", euro);//kommt 0.00 raus
	NSLog(@"Erg: %@",[importContentsBasisEuroArray objectAtIndex:0]);//kommt 17.00 raus

Beiträge: 6 394

Wohnort: Herdecke

Beruf: Selbständig

Hobbys: Gleitschirmfliegen, RC-Helikopter, Faustball

  • Private Nachricht senden

15

Freitag, 4. Mai 2012, 10:28

Kann nicht gehen. Im Deutschen werden Dezimalzahlen mit "," gertrennt un nicht mit "." Daher ist 17.00 keine Zahl. Du must erst die . durch , eretzen. Dann funktioniert es natuerlich nur in Deutschland. Wenn du es weltweit funktionierended haben willst must du einen NSNumberFormatter benutzen, wobei du dann antuerlich auch wissen must in welchem Format Deine Zahlen denn nun wirklich ankommen.

Gruß

Claus
Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)

16

Freitag, 4. Mai 2012, 10:35

Das hatte ich auch schon versucht. Nun kommt folgendes:

Quellcode

1
2
3
4
5
NSString *eurostr=[importContentsBasisEuroArray objectAtIndex:0];
	float euro=[eurostr floatValue];
	
	NSLog(@"Erg: %1.2f", euro);//kommt 0.00 raus (warum auch immer mit einem "."
	NSLog(@"Erg: %@",[importContentsBasisEuroArray objectAtIndex:0]);//kommt 17,00 raus

Beiträge: 6 394

Wohnort: Herdecke

Beruf: Selbständig

Hobbys: Gleitschirmfliegen, RC-Helikopter, Faustball

  • Private Nachricht senden

17

Freitag, 4. Mai 2012, 10:43

Die Loggerausgabe ist nicht lokalisiert. Das ist immer amerikanische Format.

schreib doch einmal explizit

Quellcode

1
2
NSString *eurostr=@"17,00";
float euro=[eurostr floatValue];


und schau was dann passiert. Eventuell hast du noch irgendwelche Sonderzeichen oder sowas in deinem String ?
Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)

18

Freitag, 4. Mai 2012, 10:51

Da kannst du wohl recht haben. Schau mal bitte:

Quellcode

1
2
3
4
5
6
7
NSString *eurostr=@"17,00";
	float euro=[eurostr floatValue];
	NSLog(@"Erg: %1.2f", euro);//kommt 17.00 raus
	NSLog(@"Erg: %@",[importContentsBasisEuroArray objectAtIndex:0]);//kommt 17,00 raus, aber obwohl die Zahl die gleiche "Breite" hat wie beim Float Ergebniss, rutscht sie bei der Konsolenanzeige in die nächste Zeile.
	//Erg: 17.00
	//Erg:
	//17,00

Beiträge: 6 394

Wohnort: Herdecke

Beruf: Selbständig

Hobbys: Gleitschirmfliegen, RC-Helikopter, Faustball

  • Private Nachricht senden

19

Freitag, 4. Mai 2012, 10:56

Tja, dann solltest du mal die Linefeeds aus Deinem String entfernen :)
Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)

20

Freitag, 4. Mai 2012, 11:02

Aber meine XML Datei sieht so aus:

Quellcode

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="UTF-8"?>

<DatenWerte>

<Daten id="1">
<basic>Wöchentlich Kündbare</basic>
<basicEuro>17,00</basicEuro>
<extra>Saunale</extra>
<extraEuro>1,79</extraEuro>
</Daten>

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Jorgo« (4. Mai 2012, 11:29)


Social Bookmarks