Sida 1 av 2

Inte Tillåtet i C++ men väl i C ?

Postat: 26 september 2020, 00:29:54
av 4kTRB
Detta är tydligen ej tillåtet i C++ men i C går det bra...

Kod: Markera allt

typedef char* CharPointer;
CharPointer A = "X";							
CharPointer B = "Y";
Läste något om att det går lösa med en array men hur ser motsvarande ut i så fall?

Re: Inte Tillåtet i C++ men väl i C ?

Postat: 26 september 2020, 08:35:15
av Nerre
Det du gör är väl pekare till sträng-konstanter? Då lägger man väl lämpligen konstanterna separat?

För som du gör nu kommer A att peka på ett "X\0" nånstans i minnet. Tilldelar du A ett annat värde så skriver du över pekaren, och det där X:et kommer ligga bortglömt i minnet och inte gå att hitta igen.

Eller är jag helt ute och cyklar nu? (Det var många år sen jag faktiskt kodade i C)

Re: Inte Tillåtet i C++ men väl i C ?

Postat: 26 september 2020, 09:28:39
av hawkan

Kod: Markera allt

char A[] = "a";

Re: Inte Tillåtet i C++ men väl i C ?

Postat: 26 september 2020, 09:58:53
av Findecanor

Kod: Markera allt

typedef char *charPointer_t;
typedef char[] charArray_t;

charArray_t a = "X"; // Array av storlek 2, initialiserad av strängliteral
charArray_t b = "Y"; // Array av storlek 2, initialiserad av strängliteral
charArray_t c = "Zebra"; // Array av storlek 6, initialiserad av strängliteral

// Nedanstående går inte i varken C eller C++:
a = "B";
a = b;

// Nedanstående är tillåtet i C men inte i C++ eftersom
// en sträng-literal i C++ har typen "const char[]".
// medans C fortsätter att använda typen "char[]" för sträng-literaler.
charPointer_t p = "Y";

// Undefined behaviour även i C. Kan leda till att programmet krashar.
p[0] = '?';

Re: Inte Tillåtet i C++ men väl i C ?

Postat: 26 september 2020, 17:43:52
av Icecap
Ett värde inramad i " är en sträng. Den består av minst 1 byte i form av 0x00 som är EOT (End Of Text).

Har man en char är den bara 1 byte och om man t.ex. pekar på "X" blir det rent faktisk en pekning till en sträng ('X', 0x00) vilket inte kan göras med en pekare till en char.

Men om man castar den kan det gå utmärkt - ganska enkelt för att castningen gör att man berättar för kompilern att man VET att man gör dumheter.
Så det är ganska logisk att det inte går rakt av.

Re: Inte Tillåtet i C++ men väl i C ?

Postat: 26 september 2020, 18:09:10
av 4kTRB
Det fungerar med avr/arduino men det blir en varning.
Warning.png

Re: Inte Tillåtet i C++ men väl i C ?

Postat: 26 september 2020, 19:02:39
av sodjan
> 1 byte i form av 0x00 som är EOT (End Of Text).

0x00 är NUL (eller null)

"End of Text" = ETX = 0x03.

("Start of Text" = STX = 0x02...

Sen så används NUL som "slut på strängen" i C (hjärndött, men så är det).

Re: Inte Tillåtet i C++ men väl i C ?

Postat: 26 september 2020, 19:35:55
av 4kTRB
GCC går att få till att låta bli att varna...
NoWarnings.png
Om det är lämpligt eller inte kan jag för lite om.

Re: Inte Tillåtet i C++ men väl i C ?

Postat: 26 september 2020, 19:42:15
av MattisLind
sodjan skrev: 26 september 2020, 19:02:39 > 1 byte i form av 0x00 som är EOT (End Of Text).

0x00 är NUL (eller null)

"End of Text" = ETX = 0x03.

("Start of Text" = STX = 0x02...

Sen så används NUL som "slut på strängen" i C (hjärndött, men så är det).
Och EOT är "End Of Transmission". I ASCII är det 0x04. I UNIX har man valt att använda EOT / 0x04 / Ctrl-D för att signalera end of file om man skickar det via terminalen. I EBCDIC är EOT 0x37.

Re: Inte Tillåtet i C++ men väl i C ?

Postat: 26 september 2020, 19:54:49
av Findecanor
Lite off-topic:
sodjan skrev: 26 september 2020, 19:02:39 Sen så används NUL som "slut på strängen" i C (hjärndött, men så är det).
Det tycker jag inte. På den tiden då C utvecklades så hade processorer få register och minne var dyrt.
I processorer brukar värdet noll ha en särställning: att det inte kostar några register eller extra instruktioner att kolla om ett värde är noll.

Problemet är snarare att man förlitar sig på en "slut på strängen"-markör överhuvudtaget istället för att skriva längd och/eller kapacitet i sträng-typen från början.

Re: Inte Tillåtet i C++ men väl i C ?

Postat: 27 september 2020, 10:40:07
av sodjan
Ja, det är ju din sista mening jag syftar på, så klart.
Den största orsaken till buffer-overflow attacker...

Aja, det var en liten utvikning... :-)

Re: Inte Tillåtet i C++ men väl i C ?

Postat: 27 september 2020, 17:29:19
av 4kTRB
Findecanor skrev: 26 september 2020, 09:58:53

Kod: Markera allt

typedef char *charPointer_t;
typedef char[] charArray_t;

charArray_t a = "X"; // Array av storlek 2, initialiserad av strängliteral
charArray_t b = "Y"; // Array av storlek 2, initialiserad av strängliteral
charArray_t c = "Zebra"; // Array av storlek 6, initialiserad av strängliteral

// Nedanstående går inte i varken C eller C++:
a = "B";
a = b;

// Nedanstående är tillåtet i C men inte i C++ eftersom
// en sträng-literal i C++ har typen "const char[]".
// medans C fortsätter att använda typen "char[]" för sträng-literaler.
charPointer_t p = "Y";

// Undefined behaviour även i C. Kan leda till att programmet krashar.
p[0] = '?';
Hänger inte riktigt med på ovanstående.
Det fungerar inte att byta ut koden så här, syntax error

Kod: Markera allt

/*
typedef char* CharPointer;
CharPointer Rb = "RB";
CharPointer Rc = "RC";
*/

typedef char[] charArray;

charArray Rb = "RB"; 
charArray Ra = "RC";

Re: Inte Tillåtet i C++ men väl i C ?

Postat: 27 september 2020, 19:25:15
av hawkan
Prova

Kod: Markera allt

typedef char charArray[];

Re: Inte Tillåtet i C++ men väl i C ?

Postat: 27 september 2020, 21:57:02
av 4kTRB
Men jag är ute efter att skicka en pekare som argument till funktionen inte en array.

Kod: Markera allt

void rRefAdjust(CharPointer c){
	bool breakFlag = true;
	double averageVoltA;
	double averageVoltB;
	double vDiff;
	Serial.write(c);									// Java-datorn skannar data från Arduino mha
	Serial.write("\n");									// java.util.Scanner.Scanner(InputStream source)
	while(breakFlag){									// Den inväntar texten RA eller RB innan data börjar
		averageVoltA = 0;								// samlas in
		averageVoltB = 0;
		vDiff = 0;
		averageData(averageVoltA, averageVoltB, vDiff);  // mät obalansen medelvärdesbilda en aning
		adjustAlert(vDiff);                     	 	 // skicka obalansspänning till Java-dator
		if (Serial.available() > 0){                     // kommando sänt? Avbryt balanstrimmning av brygga?
			if(Serial.read() == WHILE_LOOP_BREAK){       // 200 avbryter while-loop
				breakFlag = false;
			}
		}
	}
}

Re: Inte Tillåtet i C++ men väl i C ?

Postat: 27 september 2020, 22:27:18
av arvidb
4kTRB skrev: 26 september 2020, 00:29:54

Kod: Markera allt

typedef char* CharPointer;
CharPointer A = "X";							
CharPointer B = "Y";
Är inte problemet att du försöker tilldela en "const char *" till en variabel deklarerad som "char *"? (Det hela vore så mycket enklare om du angav vilket felmeddelande du får. :roll: )

Kod: Markera allt

typedef const char* StringPointer;
StringPointer A = "X";							
StringPointer B = "Y";
:?: