Add readDoubleArray
This commit is contained in:
parent
840d5b0c4f
commit
500aba94d2
73
MMS24-25.c
73
MMS24-25.c
@ -19,12 +19,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
// Define NULL if not already provided
|
||||
#ifndef NULL
|
||||
#define NULL 0
|
||||
#endif
|
||||
|
||||
void _error(char* fmt, ...) {
|
||||
void _error(char *fmt, ...) {
|
||||
fprintf(stderr, "<\x1B[31;1m ERROR \x1B[0m: \x1B[34m'");
|
||||
|
||||
va_list args;
|
||||
@ -35,11 +30,11 @@ void _error(char* fmt, ...) {
|
||||
fprintf(stderr, "'\x1B[0m >\n");
|
||||
|
||||
#ifndef _TESTS_NONSTOP
|
||||
exit(-1);
|
||||
exit(EXIT_FAILURE);
|
||||
#endif
|
||||
}
|
||||
|
||||
void _debug(char* fmt, ...) {
|
||||
void _debug(char *fmt, ...) {
|
||||
fprintf(stderr, "[\x1B[31;1m DEBUG \x1B[0m] \x1B[34m'");
|
||||
|
||||
va_list args;
|
||||
@ -50,7 +45,7 @@ void _debug(char* fmt, ...) {
|
||||
fprintf(stderr, "'\x1B[0m\n");
|
||||
}
|
||||
|
||||
void _warn(char* fmt, ...) {
|
||||
void _warn(char *fmt, ...) {
|
||||
fprintf(stderr, "[\x1B[33;1m WARN \x1B[0m] \x1B[34m'");
|
||||
|
||||
va_list args;
|
||||
@ -71,9 +66,9 @@ double interpolateLine(
|
||||
if (dX2 == dX1)
|
||||
_error("interpolateLine: dX1 and dX2 must differ!");
|
||||
|
||||
double y = dY1 * (
|
||||
double y = dY1 *(
|
||||
(dX2 - dXq) / (dX2 - dX1)
|
||||
) + dY2 * (
|
||||
) + dY2 *(
|
||||
(dXq - dX1) / (dX2 - dX1)
|
||||
);
|
||||
|
||||
@ -97,12 +92,12 @@ void rescaleDoubleArray(
|
||||
* Given $ |pdIn| = |pdOut| = iLen $ it should be, that:
|
||||
* $ min(pdIn) > dMin $, as well as
|
||||
* \[ \forall i, j \in (0,\dots,iLen-1):
|
||||
* (pdOut_i - pdOut_j) = (pdIn_i - pdIn_j) * dFactor \],
|
||||
* (pdOut_i - pdOut_j) = (pdIn_i - pdIn_j) *dFactor \],
|
||||
* which naturally results from:
|
||||
* $ pdOut_i = pdIn_i * dFactor + dMin $
|
||||
* $ pdOut_i = pdIn_i *dFactor + dMin $
|
||||
*/
|
||||
for (int i = 0; i < iLen; i++) {
|
||||
pdOut[i] = pdIn[i] * dFactor + dMin;
|
||||
pdOut[i] = pdIn[i] *dFactor + dMin;
|
||||
}
|
||||
}
|
||||
|
||||
@ -130,14 +125,14 @@ double *generateSineValues(
|
||||
|
||||
|
||||
// Initialize the output array
|
||||
double* sineArray = NULL;
|
||||
sineArray = (double*) malloc(sizeof(double) * iNumValues);
|
||||
double *sineArray = NULL;
|
||||
sineArray = (double*) malloc(sizeof(double) *iNumValues);
|
||||
|
||||
if (sineArray == NULL)
|
||||
if (sineArray == NULL)
|
||||
_error("*generateSineValues: Failed to allocate memory for Sine Array\n");
|
||||
|
||||
for (int i=0; i<iNumValues;i++){
|
||||
sineArray[i] = dAmp*sin(((2*M_PI)/iNumSamplesPerPeriod) * i);
|
||||
sineArray[i] = dAmp*sin(((2*M_PI)/iNumSamplesPerPeriod) *i);
|
||||
}
|
||||
|
||||
return sineArray;
|
||||
@ -145,13 +140,45 @@ double *generateSineValues(
|
||||
|
||||
void writeDoubleArray(double *pdOut, int iLen, char *pcOutName) {
|
||||
// Write a list of double values to a file
|
||||
FILE* datei = fopen(pcOutName, "w");
|
||||
if (datei == NULL)
|
||||
FILE *file = fopen(pcOutName, "w");
|
||||
if (file == NULL)
|
||||
_error("writeDoubleArray: Error while opening file '%s'.\n", pcOutName);
|
||||
|
||||
for (int i = 0; i < iLen; i++) {
|
||||
fprintf(datei, "%f\n", pdOut[i]);
|
||||
fprintf(file, "%f\n", pdOut[i]);
|
||||
}
|
||||
|
||||
fclose(datei);
|
||||
}
|
||||
fclose(file);
|
||||
}
|
||||
|
||||
int readDoubleArray(char *pcInName, double **ppdIn) {
|
||||
char *line = NULL;
|
||||
size_t len = 0;
|
||||
ssize_t read;
|
||||
int i = 0;
|
||||
|
||||
*ppdIn = NULL;
|
||||
|
||||
FILE *file = fopen(pcInName, "r");
|
||||
if (file == NULL)
|
||||
_error("readDoubleArray: Error while opening file '%s'.\n", pcInName);
|
||||
|
||||
while ((read = getline(&line, &len, file)) != -1) {
|
||||
if (*ppdIn == NULL) {
|
||||
*ppdIn = (double*) malloc(sizeof(double));
|
||||
} else {
|
||||
*ppdIn = (double*) realloc(*ppdIn, sizeof(double) *(i+1));
|
||||
}
|
||||
|
||||
if (*ppdIn == NULL)
|
||||
_error("readDoubleArray: Failed to allocate or re-allocate memory for pdIn\n");
|
||||
|
||||
(*ppdIn)[i] = atof(line);
|
||||
i++;
|
||||
}
|
||||
|
||||
free(line);
|
||||
fclose(file);
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
48
tests.c
48
tests.c
@ -70,7 +70,7 @@ void testInterpolation() {
|
||||
success("testInterpolation();");
|
||||
}
|
||||
|
||||
void testSineAndWriteDoubleArraySingle(int nValues, int dPLen, double dAmp) {
|
||||
void testSineAndReadWriteDoubleArraySingle(int nValues, int dPLen, double dAmp) {
|
||||
info("Trying: %d, %d, %lf", nValues, dPLen, dAmp);
|
||||
|
||||
char* fileName = NULL;
|
||||
@ -82,35 +82,57 @@ void testSineAndWriteDoubleArraySingle(int nValues, int dPLen, double dAmp) {
|
||||
|
||||
sprintf(fileName, "sine_%d_%d_%lf.results.txt", nValues, dPLen, dAmp);
|
||||
|
||||
double *pdSineValues = generateSineValues(
|
||||
nValues,
|
||||
dPLen,
|
||||
dAmp
|
||||
);
|
||||
|
||||
writeDoubleArray(
|
||||
generateSineValues(
|
||||
nValues,
|
||||
dPLen,
|
||||
dAmp
|
||||
),
|
||||
pdSineValues,
|
||||
nValues,
|
||||
fileName
|
||||
);
|
||||
|
||||
success("Wrote %d values to %s", nValues, fileName);
|
||||
|
||||
double *pdReadValues = NULL;
|
||||
int iReadValues = readDoubleArray(
|
||||
fileName,
|
||||
&pdReadValues
|
||||
);
|
||||
|
||||
if (iReadValues != nValues) {
|
||||
error("Failed to read the correct number of values: %d != %d", iReadValues, nValues);
|
||||
}
|
||||
|
||||
success("Read %d values from %s", iReadValues, fileName);
|
||||
|
||||
for (int i=0; i<nValues; i++) {
|
||||
if (round(pdSineValues[i]*1e6) != round(pdReadValues[i]*1e6)) {
|
||||
error("Failed to read the correct value at index %d: %lf != %lf", i, pdSineValues[i], pdReadValues[i]);
|
||||
}
|
||||
}
|
||||
|
||||
info("use `plot \"%s\", \"%s\" with lines` to view.", fileName, fileName);
|
||||
|
||||
free(fileName);
|
||||
}
|
||||
|
||||
void testSineAndWriteDoubleArray() {
|
||||
void testSineAndReadWriteDoubleArray() {
|
||||
info("testSineAndWriteDoubleArray");
|
||||
|
||||
testSineAndWriteDoubleArraySingle(1000, 300, 1);
|
||||
testSineAndWriteDoubleArraySingle(10, 10, 0.5);
|
||||
testSineAndWriteDoubleArraySingle(10, -10, 0.5);
|
||||
testSineAndWriteDoubleArraySingle(10, 10, 0);
|
||||
|
||||
testSineAndReadWriteDoubleArraySingle(1000, 300, 1);
|
||||
testSineAndReadWriteDoubleArraySingle(10, 10, 0.5);
|
||||
testSineAndReadWriteDoubleArraySingle(10, -10, 0.5);
|
||||
testSineAndReadWriteDoubleArraySingle(10, 10, 0);
|
||||
|
||||
success("testSineAndWriteDoubleArray");
|
||||
}
|
||||
|
||||
int main (int iArgC, char** ppcArgV){
|
||||
testInterpolation();
|
||||
testSineAndWriteDoubleArray();
|
||||
testSineAndReadWriteDoubleArray();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user