een bepaalde tekst in een char[] variabele stoppen

Hey,

ik heb (weer) een vraagje :

ik zou nu in m'n projectje een bepaalde 'fout' als "FOUT!" willen weergeven op m'n display's

class HeatClass
{
     public:
         long wisselTijd;
         ...
=>    char wisselTxt[6];
         ...
         HeatClass()

        {
=>    wisselTxt = ' '; // enkele aanhalingstekens voor een array !
         ...
        };
};
HeatClass Heat[16];

nu krijg ik daar een compiler fout op :
incompatible types in assignment of 'const char [1]' to 'char [6]'

en dan bvb verder ergens :

...
Heat[15].wisselTxt ='FOUT!'; // enkele aanhalingstekens voor een array
...

waar ik dan deze op krijg:
expected constructor, destructor, or type conversion before '.' token

heb geprobeerd met dubbele aanhalingstekens, maar was ook niets
heeft dit mss te maken omdat het een array binnen een array is dat het niet kan of zo?

Grtz,
Yves

mmmh,

en ook deze werkt niet :

...
strcpy(wisselTxt, ''); // deze raakt dus niet door de compiler
...
...
...

strcat(Heat[15].wisselTxt, 'FOUT!'); // en deze ook niet

dit krijg ik van de compiler voor de eerste regel code
error: empty character constant

dit krijg ik van de compiler voor de tweede regel code
expected constructor, destructor, or type conversion before '(' token

Grtz,
Yves

ik weet niet wat heatclass is maar als je een text in een char[] string wilt zetten kun je gewoon:

strcpy(Heat[15].wisselTxt, "FOUT");

En dus dubbele quotes gebruiken. Enkele quotes zijn voor constanten.

hey Nico,

jullie komen een en ander tegen héé met mij :-[

HeatClass is als volgt opgebouwd:

class HeatClass
{
 public:
  long wisselTijd;
  long loopTijd;
  long wissel;
  long heatTijd;
  long race;
  long raceWissels;
  float wisselDecimal;
  float looptijdDecimal;
  float raceDecimal;
  float racewisselsDecimal;
  char wisselTxt[6];
  char heatTxt[7];
  char racewisselsTxt[8];
  char racelooptijdTxt[8];
  HeatClass()
  {
  wissel = 0;
  loopTijd = 0;
  wisselTijd = 0;
  };
};
HeatClass Heat[16];

maar uw oplossing werkt ook niet met de dubbele quotes (had die ook al eens uitgetest :wink: )

Grtz,
Yves

Dan ben ik toch wel erg geïnteresseerd in de volledige code

@edit:
ff dit test programmatje gemaakt... Compileert als een tierelier....

#include "Arduino.h"
class HeatClass
{
 public:
  long wisselTijd;
  long loopTijd;
  long wissel;
  long heatTijd;
  long race;
  long raceWissels;
  float wisselDecimal;
  float looptijdDecimal;
  float raceDecimal;
  float racewisselsDecimal;
  char wisselTxt[6];
  char heatTxt[7];
  char racewisselsTxt[8];
  char racelooptijdTxt[8];
  HeatClass()
  {
  wissel = 0;
  loopTijd = 0;
  wisselTijd = 0;
  };
};
HeatClass Heat[16];

void setup() {
	strcpy(Heat[15].wisselTxt, "FOUT");
}

void loop(){

}

nicoverduin:
En dus dubbele quotes gebruiken. Enkele quotes zijn voor constanten.

foei foei nico (was er maar een zweep smiley :smiling_imp: )
enkele quotes zijn voor characters en dubbele quotes zijn voor null-terminated strings.

Omdat het dus gaat om null terminated strings moet je ook altijd 1 character meer hebben dan wat je nodig hebt.
Dus met

char wisselTxt[6];

kan je daar "FOUT" = 'F'+'O'+'U'+'T'+0 in kwijt en ook "FOUT!" maar "FOUT1!" geeft een moeilijk op te sporen fout.
Om de moeilijk op te sporen fout te vermijden gebruik ik liever strlcat en strlcpy. Daar geef je de grootte van de buffer mee.
Je krijgt dan typisch

strlcpy(Heat[15].wisselTxt, "FOUT",sizeof(Heat[15].wisselTxt));

nicoverduin:
Dan ben ik toch wel erg geïnteresseerd in de volledige code

Ik ook

Jantje

Jantje:
foei foei nico (was er maar een zweep smiley :smiling_imp: )
enkele quotes zijn voor characters en dubbele quotes zijn voor null-terminated strings.

Dat bedoelde ik ook :grin: kom maar... kom maar.... ik kan het hebben :grin:

haha gasten,

FORUMFIGHT :smiley:

ga het deze avond direct eens uit proberen, beide methodes

nog een bijkomend vraagje, als je je array opmaakt, wat is dan de waarde van Heat[15].wisselTxt tot op het moment dat je er een waarde aan toekend, NULL of zo?, gewoon een lege string ''?

ik wil het programma voor een deel als volgt afhandelen:

if (Heat[15].wisselTxt == '')
{
doe iets...
} else {
doe iets anders
}

Grtz,
Yves

if (Heat[15].wisselTxt == '')

Dit doet dus niet wat je wilt om 2 redenen.
single quote staat voor character maar je geeft er geen. 'a' is goed; 'A' is goed; 'aa' is het niet en '' ook niet
Ten tweede zeg je hier:
char wisselTxt[6];
dat wisselTxt een char array van 6 byte tekens lang is (dus maximaal 5 ASCII tekens plus één 0).
om char array te vergelijken met je een functie gebruiken zoal strcmp. == werkt niet met null terminated strings. Als je de String klasse gebruikt (en dat raad ik je niet aan) kan je wel == gebruiken.

Als de compiler deze code al wilt compileren vermoed ik dat hij een pointer vergelijking gaat doen die dus ook altijd fout zal even.

Wat de waarde is van toegewezen niet geïnitializeerde variabelen is volgens mij hardware/compiler afhankelijk. Alhoewel ik op Arduino bijna altijd 0 zie; hou ik het toch op onbekend.

FORUMFIGHT :smiley:

Ja ja kom maar op :grin:

woehoe Jantje,

nu ben je me even helemaal kwijt hoor... :fearful:

de eerste regels van je uitleg gaan nog net... maar dan gaat het zeer snel minderen hoor :sweat_smile:

mogelijks moet ik voor een totaal andere benadering gaan uitkijken, het lijkt me dat ik hier niet goed bezig ben...

ik ben nu echt wel de "kluts" kwijt, en serieus aan het twijfelen over hoe ik dit nu moet oplossen

Grtz,
Yves

Als een char array niet is geinitialiseerd heb je een onvoorspelbaar resultaat. Een uitstekende gewoonte is om ALTIJD een variabele te initialiseren zodat je altijd van een bekende situatie kan uitgaan/
En bij een char arrau[] is dat vrij gemakkelijk bijv:

char text[10];

en dan verder in de setup()

text[0] = '\0';

En voor de meer bekenden met C/C++... je het kan anders maar laat ze eerst maar de basis leren...

Yves
Ik denk niet dat je op het verkeerde spoor zit.
Maar C heeft eigenlijk geen echte ondersteuning voor strings. Maar wel voor arrays.
Je kan een String zien als een array van characters. Als je dus een array van 6 characters maakt en je steekt er "ab" in heb je 4 characters over waarvan de waarde onbekend is. Dat is nog veel vervelender dan dat jij je nu kan indenken.
Daarom dat er een conventie is die we null-terminated string noemen en die zegt: "de laatste character van de string wordt gevold door een character met ascii waarde 0" ( een character met ascii waarde 0 is hetzelfde is als ' \0' die Nico hiervoor gebruikt)
Dus als je zegt
Heat[15].wisselTxt ="FOUT!";
zeg je eigenlijk
Heat[15].wisselTxt ="FOUT!\0";
Daarom dat het belangrijk is om onderscheid te maken tussen een character (met enkel quotes) en een string (met dubbel quotes)
char char_a='a'; //dit is ok
char char_b="b"; // dit is niet ok want "b" is 'b'+'\0' dus je hebt 2 characters nodig en char_b heeft maar plaats voor 1 character.

Ik hoop dat het wat duidelijker is

Jantje