#include #include #include struct dentry { const char *key; uint32_t *value; }; static uint32_t vals[20] = { /* ... */ // BEGIN:INPUT 2012, 2636, 2519, 236, 960, 2908, 142, 904, 766, 2890, 3196, 2445, 911, 1281, 1315, 437, 656, 347, 2361, 1856 // END:INPUT }; static struct dentry data[20] = { /* ... */ // BEGIN:INPUT { "Ofen1", &vals[0] }, { "Ofen2", &vals[1] }, { "Ofen3", &vals[2] }, { "Ofen4", &vals[3] }, { "Ofen5", &vals[4] }, { "Ofen6", &vals[5] }, { "Ofen7", &vals[6] }, { "Ofen8", &vals[7] }, { "Ofen9", &vals[8] }, { "Ofen10", &vals[9] }, { "Ofen11", &vals[10] }, { "Ofen12", &vals[11] }, { "Ofen13", &vals[12] }, { "Ofen14", &vals[13] }, { "Ofen15", &vals[14] }, { "Ofen16", &vals[15] }, { "Ofen17", &vals[16] }, { "Ofen18", &vals[17] }, { "Ofen19", &vals[18] }, { "Ofen21", &vals[19] } // END:INPUT }; // BEGIN:DESCRIPTION /* * In einer größeren Industriesteuerungsanlage wird Eisen in mehreren * Hochöfen verhüttet. Leider ist die Automatisierung noch nicht ausreichend fortgeschritten und * der Anstich muss hier manuell durch die Mitarbeiter vorgenommen werden. Dies ist möglich, sobald die * der Schmelzpunkt von 1800°K erreicht wurde. * * Um die Mitarbeiter zu benachrichtigen läuft in regelmäßigen Abständen hierzu das von Ihnen * zu verfassende Programm. Es filtert mittels der zu implementierenden Funktion \lstinline|filterSensors| * die Namen der Öfen, welche "abstichreif" sind und gibt die zugehörigen Namen dann mittels der * (ebenfalls zu implementierenden) Funktion \lstinline|printSensors| für die Stahlkocher aus. * * Hinweis: * Die vollständige Quelltextdatei ist auch unter TODO herunterladbar * * Aufgabe: * - Implementieren Sie die Funktion \lstinline|filterSensors| * - Implementieren Sie die Funktion \lstinline|printSensors| * - Denken Sie daran, alle möglicherweise allokierten Ressourcen in \lstinline|main| an * den gekennzeichneten Stellen wieder freizugeben * - Übersetzen Sie Ihr Programm * $ gcc sensors.c -ggdb -Wall -Wextra -pedantic -pedantic-errors -Werror=pedantic -o sensors * - Überprüfen Sie die funktionale Korrektheit (in erster Näherung) per Vergleich mit der folgenden Ausgabe * $ ./sensors * Ofen1 * Ofen2 * Ofen3 * Ofen6 * Ofen10 * Ofen11 * Ofen12 * Ofen19 * Ofen20 * - Überprüfen sie sowohl die Speicherzugriffe per Zeiger als auch die Freigabe aller * allokierten Ressourcen. Eine erste gute Einschätzung kann hier das Programm valgrind liefern, * es sollten in ihrer Lösung keine Fehler detektiert werden: * $ valgrind --leak-check=full ./sensors * ... * ==....== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) * ... */ // END:DESCRIPTION const char **filterSensors(struct dentry *data, unsigned int num, uint32_t cutoff) { // Eingabeparameter: // - data: Array mit num Sensorwerten und Bezeichnern // - num: Anzahl der Öfen // - cutoff: Die Schmelztemperatur ab der der Kessel abstichreif ist // Rückgabewert: // - Array der Ofennamen (struct dentry.key) derjenigen Öfen, deren Wert (struct dentry.value) größer // als die Temperatur cutoff ist. /* Hier müsst ihr selbst Code vervollständigen */ // BEGIN:STUDENTENCODE char const **res = malloc(num * sizeof(const char *)); if (res == NULL) { exit(EXIT_FAILURE); } unsigned int r = 0; for (unsigned int i = 0; i < num; i++) { if (*data[i].value >= cutoff) { res[r++] = data[i].key; } } res[r++] = NULL; return res; // END:STUDENTENCODE } void printSensors(const char **sensors) { // Eingabeparameter: // - sensors: Die Namen der Öfen, welche den Mitarbeitern als abstichreif gemeldet werden müssen // Funktionalität: // - Ausgabe der Ofennamen auf der Kommandozeile (stdout). /* Hier müsst ihr selbst Code vervollständigen */ // BEGIN:STUDENTENCODE while(*sensors) { puts(*(sensors++)); } // END:STUDENTENCODE } int main(void) { const char **res = filterSensors(data, sizeof(data)/sizeof(*data), 1800); printSensors(res); /* Hier müsst ihr selbst Code vervollständigen */ // BEGIN:STUDENTENCODE free(res); // END:STUDENTENCODE return 0; }