English Amiga Board


Go Back   English Amiga Board > Coders > Coders. Language > Coders. C/C++

 
 
Thread Tools
Old 01 December 2023, 16:33   #1
AlfaRomeo
A1200 040 SAM440EP 667
 
AlfaRomeo's Avatar
 
Join Date: Jan 2008
Location: Lisbon / Portugal
Posts: 873
Buffer lenght

Hello, I´m trying to make a program to display some variables of Temperature and voltage stored inside 3 folders in ENV:

All is ok but I don´t know why some garbage square chars appear after the printed variables as could be seen from the image attached.

I even printed the lenght of the variables buffer in another window but it´s normal, without the size of the garbage squares that I don´t know where they come from

Does someone know how I can get rid of that garbage chars??

Code:
#include <proto/all.h>
#include <exec/types.h>
#include <intuition/intuition.h>
#include <libraries/dos.h>
#include <stdlib.h>
#include <stdio.h>

#define screenWidth 320
#define screenHeight 200
#define screenLeft 0
#define screenTop 0

// Recebe os files com as variaveis, abre-os, extrai e envia as variaveis
char *readFile(const char *envName)
{
    struct FILE *file;
    char fileName[100];
    char *buffer = NULL;
    size_t length = 0;
    size_t bytesRead;

    //Abre SensorFile para ler variavel
    sprintf(fileName,"ENV:%s",envName);

    file=fopen(fileName,"r");
    if(file==NULL){
        perror("Nao consegui abrir a variavel");
        return -1;
        }

    // Determina o tamanho do arquivo
    fseek(file, 0, SEEK_END);
    length = ftell(file);
    fseek(file, 0, SEEK_SET);
    printf ("Lenght: %i\n",length);
    // Aloca memória para o buffer
    buffer = (char *)malloc(length + 1); // +1 para o caractere nulo de terminação

    // Passa o conteúdo do arquivo para o buffer
    bytesRead = fread(buffer, 1, length, file);

    // Adiciona caracter nulo de terminação no final do buffer
    buffer[bytesRead] = '\0';

    fclose(file);
    return buffer;
    }

int main() {
   struct Window *myWindow;
   int hasEnded = FALSE;
   struct IntuiMessage *msg;
   ULONG msgClass;
   char *str;
   int i;

   char *varName[]={
   "AK_5V_supply_V",
   "AK_Internal_temp_C",
   "AK_RTC_battery_percent"
   };


   // open window on the public workbench screen
   struct NewWindow winlayout = {
      screenLeft, screenTop,
      screenWidth, screenHeight,
      0,1,
      IDCMP_CLOSEWINDOW,
      WFLG_SIZEGADGET | WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_CLOSEGADGET | WFLG_ACTIVATE,
      //NULL,
      //NULL,
      NULL, NULL,
      "Volts / Temp",
      //NULL,
      NULL,NULL,
      0,0,
      600,400,
      WBENCHSCREEN
   };
   myWindow = OpenWindow(&winlayout);
   i=0;
   while(i<3){
       str=readFile(varName[i]);       
       if(i==0){
           Move(myWindow->RPort, 40, 60);
           Text(myWindow->RPort, str, 5);
           }
       if(i==1){
           Move(myWindow->RPort, 40, 80);
           Text(myWindow->RPort, str, 10);
           }
       if(i==2){
           Move(myWindow->RPort, 40, 100);
           Text(myWindow->RPort, str, 14);
           }
   i++;
   }

   while (hasEnded == FALSE) {
       // wait for and event
       Wait(1L << myWindow->UserPort->mp_SigBit);

       // get message
       msg = GT_GetIMsg(myWindow->UserPort);

       // get class of message;
       msgClass = msg->Class;

       // handle message (close it);
       GT_ReplyIMsg(msg);

       if (msgClass == IDCMP_CLOSEWINDOW) {
           CloseWindow(myWindow);
           free(str);
           hasEnded = TRUE;
       }
   }
   return(0);
}
Attached Thumbnails
Click image for larger version

Name:	TemSensor.jpg
Views:	44
Size:	347.9 KB
ID:	80912  
AlfaRomeo is offline  
Old 01 December 2023, 16:39   #2
a/b
Registered User
 
Join Date: Jun 2016
Location: europe
Posts: 1,039
You're telling gfxlib to print 5/10/14 chars while the actual strings are shorter. You should do strlen() or something similar, and then send that to Text() as the 3rd parameter (length).
a/b is offline  
Old 01 December 2023, 16:56   #3
AlfaRomeo
A1200 040 SAM440EP 667
 
AlfaRomeo's Avatar
 
Join Date: Jan 2008
Location: Lisbon / Portugal
Posts: 873
Thanks a/b, already solved with "Text(myWindow->RPort, str, strlen(str)); "
AlfaRomeo is offline  
Old 01 December 2023, 21:00   #4
Photon
Moderator
 
Photon's Avatar
 
Join Date: Nov 2004
Location: Eksjö / Sweden
Posts: 5,604
If you have lots of strings, some library functions that require the length provided can be a nuisance.

The problem is the same as on any system, though. There are two solutions:
1. Store strings as BCPL, Pascal, etc together with a length value, e.g. before the first character of the string. This value is read when printing and updated when the string is manipulated to change its length. Low performance cost.
2. Put a termination character after the string, e.g. 0 (ASCIIZ). Requires scanning the entire string before even printing it, but allows free manipulation. High performance cost.

In C, a char array is zero-terminated, i.e. strlen() is category 2 / high performance cost.
Photon is offline  
Old 01 December 2023, 21:45   #5
Karlos
Alien Bleed
 
Karlos's Avatar
 
Join Date: Aug 2022
Location: UK
Posts: 4,165
Quote:
Originally Posted by Photon View Post
If you have lots of strings, some library functions that require the length provided can be a nuisance.

The problem is the same as on any system, though. There are two solutions:
1. Store strings as BCPL, Pascal, etc together with a length value, e.g. before the first character of the string. This value is read when printing and updated when the string is manipulated to change its length. Low performance cost.
2. Put a termination character after the string, e.g. 0 (ASCIIZ). Requires scanning the entire string before even printing it, but allows free manipulation. High performance cost.

In C, a char array is zero-terminated, i.e. strlen() is category 2 / high performance cost.
You can do both if you are prepared to create your own type and only allow it to be modified by functions. That way you only need to strlen() it when any function you provide that can change it is called (you might even get away with checking the base address hasn't changed, but that seems risky since depending on how the string changes, it might remain in the same location).
Karlos is offline  
Old 01 December 2023, 22:09   #6
a/b
Registered User
 
Join Date: Jun 2016
Location: europe
Posts: 1,039
Nah, keep it simple and just include STL's basic_string<template <template <template werwer, fsdfsd>, template <we,msdfsdf>, template <fesdfsdf> > >, template^25 <have, fun, with, 10, pages of, error, messages> >.
a/b is offline  
 


Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 
Thread Tools

Similar Threads
Thread Thread Starter Forum Replies Last Post
X-Copy track lenght option kremiso support.Apps 0 10 March 2023 12:01
How to assign some buffer for a string? peceha Coders. Blitz Basic 3 21 August 2018 11:19
Print buffer... Pheonix support.WinUAE 0 05 December 2016 23:56
TFMX decoder - module lenght? trodas request.Modules 4 28 August 2014 09:12
Double buffer copper?? h0ffman Coders. General 8 19 July 2011 19:10

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT +2. The time now is 11:15.

Top

Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2024, vBulletin Solutions Inc.
Page generated in 0.10732 seconds with 14 queries