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

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
4kTRB
Inlägg: 18279
Blev medlem: 16 augusti 2009, 19:04:48

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

Inlägg 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?
Nerre
Inlägg: 26652
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

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

Inlägg 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)
Användarvisningsbild
hawkan
Inlägg: 2585
Blev medlem: 14 augusti 2011, 10:27:40

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

Inlägg av hawkan »

Kod: Markera allt

char A[] = "a";
Findecanor
Inlägg: 982
Blev medlem: 2 juli 2010, 23:04:07

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

Inlägg 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] = '?';
Användarvisningsbild
Icecap
Inlägg: 26105
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

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

Inlägg 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.
Användarvisningsbild
4kTRB
Inlägg: 18279
Blev medlem: 16 augusti 2009, 19:04:48

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

Inlägg av 4kTRB »

Det fungerar med avr/arduino men det blir en varning.
Warning.png
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43147
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

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

Inlägg 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).
Användarvisningsbild
4kTRB
Inlägg: 18279
Blev medlem: 16 augusti 2009, 19:04:48

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

Inlägg 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.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
MattisLind
Inlägg: 738
Blev medlem: 27 maj 2011, 20:27:12
Ort: Älvsjö
Kontakt:

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

Inlägg 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.
Findecanor
Inlägg: 982
Blev medlem: 2 juli 2010, 23:04:07

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

Inlägg 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.
Senast redigerad av Findecanor 27 september 2020, 11:05:11, redigerad totalt 1 gång.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43147
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

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

Inlägg 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... :-)
Användarvisningsbild
4kTRB
Inlägg: 18279
Blev medlem: 16 augusti 2009, 19:04:48

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

Inlägg 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";
Användarvisningsbild
hawkan
Inlägg: 2585
Blev medlem: 14 augusti 2011, 10:27:40

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

Inlägg av hawkan »

Prova

Kod: Markera allt

typedef char charArray[];
Användarvisningsbild
4kTRB
Inlägg: 18279
Blev medlem: 16 augusti 2009, 19:04:48

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

Inlägg 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;
			}
		}
	}
}
Användarvisningsbild
arvidb
Inlägg: 4537
Blev medlem: 8 maj 2004, 12:56:24
Ort: Stockholm

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

Inlägg 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";
:?:
Skriv svar