Tycker mig känna att pekare och adressaritmetik är guld att
ha lite grepp om när Arduino ska programmeras så jag koncentrerar
mig på det just nu.
Skapade en klass som representerar en stack och vitsen blir ju då att
jag kan skapa så många stackar jag behöver genom att skapa en ny instans.
På det sätt jag valt i koden så blir det just nu minne som ligger oanvänt om
jag inte väljer att skapa stackar som går upp till maxgränsen som är satt.
I Arduino är det säkert fint att ha så mycket fritt minne som möjligt så
då ska jag försöka lägga till en funktion som frigör det minne som inte används.
När jag skapade klassen i Eclipse så frågas om ett namn på NAMESPACE så jag skrev in
std och då genererades en mall med klammer runt hela .h och .cpp koden. Jag fick en del
"mystiska" fel när jag skrev koden så jag hoppade tillbaka till using namespace std; som
jag använt tidigare. Nu vet jag inte om det var där felet låg men jag brydde mig inte om
att testa varianten som Eclipse skapade.
En sak här nedan som jag inte riktigt är med på är testet
if ((allocbuf + STACKSIZEMAX - stackTopPointer) >= stackSize)
stackTopPointer är ju tycker jag inte növändigt men med testet
if ((allocbuf + STACKSIZEMAX) >= stackSize)
så blir det enligt kompilatorn illegalt ?
Kod: Markera allt
//============================================================================
// Name : MyFirstC++.cpp
// Author : 4kTRB
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include "StackDouble.h"
using namespace std;
int main() {
StackDouble stackDouble_000(2); // första stacken
cout << "push" << NEWLINE;
stackDouble_000.push(5.5);
cout << "push" << NEWLINE;
stackDouble_000.push(6.5);
cout << "push" << NEWLINE;
stackDouble_000.push(7.5);
cout << "pop ";
cout << stackDouble_000.pop() << NEWLINE;
cout << "pop ";
cout << stackDouble_000.pop() << NEWLINE;
cout << "pop ";
cout << stackDouble_000.pop() << NEWLINE;
cout << STRING << NEWLINE;
StackDouble stackDouble_001(3); // andra stacken
cout << "push" << NEWLINE;
stackDouble_001.push(15.5);
cout << "push" << NEWLINE;
stackDouble_001.push(16.5);
cout << "push" << NEWLINE;
stackDouble_001.push(17.5);
cout << "pop ";
cout << stackDouble_001.pop() << NEWLINE;
cout << "pop ";
cout << stackDouble_001.pop() << NEWLINE;
cout << "pop ";
cout << stackDouble_001.pop() << NEWLINE;
cout << STRING << NEWLINE;
return 0;
}
/*
* StackDouble.h
*
* Created on: 4 feb. 2019
* Author: 4kTRB
*/
#pragma once
#define STACKDOUBLE_H_
#define STACKSIZEMAX 20
#define NEWLINE '\n'
#define STRING "==========================================="
#include <iostream>
class StackDouble {
public:
StackDouble(int);
bool allocdouble();
void push(double);
double pop(void);
private:
};
/*
* StackDouble.cpp
*
* Created on: 4 feb. 2019
* Author: 4kTRB
*/
#include "StackDouble.h"
static double allocbuf[STACKSIZEMAX];
static double* stackTopPointer;
static int stackSize;
using namespace std;
StackDouble::StackDouble(int stacksize) {
cout << "En instans av StackDouble" << NEWLINE;
cout << STRING << NEWLINE;
stackSize = stacksize;
stackTopPointer = allocbuf; // peka på element noll i allocbuf
// stackTopPointer = &allocbuf[0]; // fungerar också
bool b = allocdouble(); // allokera en stack om stacksize double
if(!b){
cout << "Allokering av stack överskred STACKSIZEMAX" << NEWLINE;
cout << "STACKSIZEMAX = " << STACKSIZEMAX << NEWLINE;
cout << STRING << NEWLINE;
}
}
/**
* Allokera ett minnesområde för att lagra double.
* Avancera pekaren stackTopPointer n steg för att peka på
* start av stacken.
* Returnera true om den allokerade stacken håller
* sig inom ramen för STACKSIZEMAX annars returnera false
*/
bool StackDouble::allocdouble(){
if ((allocbuf + STACKSIZEMAX - stackTopPointer) >= stackSize){
stackTopPointer += stackSize;
return true;
} else
return false;
}
void StackDouble::push(double f){
if(stackTopPointer > allocbuf){
*stackTopPointer = f;
stackTopPointer--;
}
else{
cout << "Stacken är full" << NEWLINE;
}
}
double StackDouble::pop(){
if(stackTopPointer < (allocbuf + stackSize)){
stackTopPointer++;
return *stackTopPointer;
}
else{
cout << "Stacken är tom så noll returneras ";
return 0.0;
}
}
En instans av StackDouble
===========================================
push
push
push
Stacken är full
pop 6.5
pop 5.5
pop Stacken är tom så noll returneras 0
===========================================
En instans av StackDouble
===========================================
push
push
push
pop 17.5
pop 16.5
pop 15.5
===========================================