Forum: PC-Programmierung Problem beim Implementieren C++


von APP I. (mac21)


Angehängte Dateien:

Lesenswert?

Hallo alle Zusammen habe gerade Probleme bei der g).

Verstehe einfach nicht wie ich das implementieren soll?

Mein code sieht soweit so aus ?

1
#ifndef CLINESEGMENT_H_
2
#define CLINESEGMENT_H_
3
#include<iostream>
4
#include <string>
5
using namespace std;
6
7
class CLineSegment{
8
9
private:
10
11
  string m_name;
12
  float m_x1;
13
  float m_y1;
14
  float m_x2;
15
  float m_y2;
16
17
public:
18
19
  CLineSegment(string name = "",float x1 = 0, float y1 = 0,float x2 = 0,float y2 = 0);
20
21
  float length();
22
  bool prolongedBy(const CLineSegment& segment);
23
  bool getCoefficients(double& slope,double& yIntercept);
24
  bool Intersects(CLineSegment& other );
25
  friend ostream& operator<< (ostream& out ,CLineSegment lineSegment);
26
27
28
};
29
30
ostream& operator<< (ostream& out ,CLineSegment lineSegment);
31
32
33
34
35
36
#endif /* CLINESEGMENT_H_ */

CSegment cpp
1
#include<iostream>
2
#include <string>
3
#include "CLineSegment.h"
4
#include<cmath>
5
using namespace std;
6
7
CLineSegment::CLineSegment(string name ,float x1, float y1,float x2 ,float y2 ){
8
9
  m_name = name;
10
  m_x1 = x1;
11
  m_y1 = y1;
12
  m_x2 = x2;
13
  m_y2 = y2;
14
15
16
17
18
}
19
float CLineSegment::length(){
20
21
  float f1 = pow(m_x2-m_x1,2.0f);
22
  float f2 = pow(m_y2-m_y1,2.0f);
23
24
  return sqrt( f1 - f2 );
25
}
26
27
bool CLineSegment::prolongedBy(const CLineSegment& segment){
28
  if(m_x1 == segment.m_x2 && m_y1 == segment.m_y2){
29
30
    return true;
31
  }
32
  else{
33
34
    return false;
35
  }
36
37
38
}
39
40
bool CLineSegment::getCoefficients(double& slope,double& yIntercept){
41
  slope = ((m_y2-m_y1)/(m_x2-m_x1));
42
  yIntercept = m_y2-(slope*m_x2);
43
if(slope == 0){
44
45
    return false;
46
  }
47
  return slope+yIntercept;
48
49
50
}
51
52
bool CLineSegment::Intersects(CLineSegment& other ){
53
54
  double slopethis;
55
  double yInterceptthis;
56
  double slope;
57
  double yIntercept;
58
59
  getCoefficients(slopethis, yInterceptthis);
60
  other.getCoefficients(slope, yIntercept);
61
62
   double x;
63
64
   x= (yInterceptthis-yIntercept)/(slopethis-slope);
65
66
67
   if( m_x1<= x <= m_x2 || m_x2<= x <= m_x1){
68
     return true;
69
   }
70
71
72
73
74
}
75
ostream& operator<< (ostream& out ,CLineSegment lineSegment){
76
77
  out << lineSegment.m_name << "von " << ""<< lineSegment.m_x1 << "," << lineSegment.m_y1 << " nach "<<lineSegment.m_x2 << "," << lineSegment.m_y2 << "" << "Länge:"<< lineSegment.length() ;
78
  return out;
79
}


1
#ifndef CPOLYGON_H_
2
#define CPOLYGON_H_
3
#include<iostream>
4
#include <string>
5
#include"CLineSegment.h"
6
using namespace std;
7
8
class CPolygon{
9
10
private:
11
  unsigned int m_maxSegments;
12
  unsigned int m_countSegments = 0;
13
  CLineSegment* m_segments;
14
15
public:
16
  CPolygon(unsigned int initialSize = 10);
17
  CPolygon();
18
  void addEdge(CLineSegment edge);
19
  float sumOfLenghts();
20
  void print();
21
  bool isValid();
22
  bool isSimple();
23
};
24
25
26
27
28
#endif /* CPOLYGON_H_ */


cpp
1
#include<iostream>
2
#include <string>
3
#include "CPolygon.h"
4
using namespace std;
5
6
CPolygon::CPolygon(unsigned int initialSize){
7
8
    m_maxSegments = initialSize;
9
  if(initialSize <3){
10
    m_maxSegments = 10;
11
  }
12
  m_segments = new CLineSegment [m_maxSegments];
13
14
15
}
16
17
CPolygon::~CPolygon(){
18
19
   delete[] m_maxSegments;
20
}
21
void  CPolygon::addEdge(CLineSegment edge){
22
23
  m_segments[m_countSegments] = edge;
24
25
  if(m_countSegments>= m_maxSegments){
26
    m_segments[1.5*m_countSegments] = edge;
27
28
  }
29
}
30
31
float CPolygon::sumOfLenghts(){
32
  double summe = 0;
33
  for (int i = 0; i<m_maxSegments; i++){
34
35
    summe += m_segments[i];
36
37
  }
38
39
40
}
41
void  CPolygon::print(){
42
43
  cout << " Polygon mit Kante:" << endl;
44
  for (int i=0; i<m_maxSegments ;i++){
45
  cout << m_segments[i] << endl;
46
47
      cout << " Summer der Kantenlänge:  " << CPolygon::sumofLengths() ;
48
  }
49
50
}
51
52
bool CPolygon::isValid(){
53
54
  if(m_segments == 3){
55
56
57
  }
58
}

Habe einen kleinen Ansatz für die g) aber mehr nicht leider

Bitte um Hilfe

Und diese Fehlermeldung:
Description  Resource  Path  Location  Type
Function 'sumofLengths' could not be resolved  CPolygon.cpp 
/CLineSegment  line 54  Semantic Error

Es handelt sich um eine alte Klausur an der ich übe

: Bearbeitet durch User
von Arc N. (arc)


Lesenswert?

sumofLengths
oder
sumOfLenghts

zur g)
prolongedBy: Die aktuelle (this) Linie wird von segment verlängert.
Ist dann
m_x1 == segment.m_x2 && m_y1 == segment.m_y2 erfüllt oder
m_x2 == segment.m_x1 && m_y2 == segment.m_y1

isValid: == 3 oder >= 3
Fehlt noch was passiert, wenn es mehr als drei Segmente gibt... Ich 
würd's mit for lösen

addEdge: m_countSegments wird nicht erhöht und
1
  if(m_countSegments>= m_maxSegments){
2
    m_segments[1.5*m_countSegments] = edge;
3
4
  }
macht definitiv nicht das, was gefordert ist (das Array m_segments 
vergrößern)... zudem muss vor dem Hinzufügen geprüft werden, ob genug 
Platz ist, nicht nachher.

von asdfasd (Gast)


Lesenswert?

Und schau da nochmal drüber ;-)
1
if( m_x1<= x <= m_x2 || m_x2<= x <= m_x1)

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Und tue Dir selbst einen Gefallen und nimm std::vector<> statt den 
Speicher selbst zu verwalten oder mach' es zumindest richtig! (rules of 
three/five; 
https://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming))

von APP I. (mac21)


Lesenswert?

1
void  CPolygon::addEdge(CLineSegment edge){
2
for (int m_countSegments =0; m_countSegments>m_maxSegments; i++){
3
4
5
  
6
7
  if(m_countSegments>= m_maxSegments){
8
    m_segments[1.5*m_countSegments] = edge;
9
10
  }
11
m_segments[m_countSegments] = edge;
12
13
}
14
}

Passt der Code jetzt besser ?


Was soll den hier jetzt genau falsch sein ?

f( m_x1<= x <= m_x2 || m_x2<= x <= m_x1)

Bitte um ein wenig Erklärung

von Carl D. (jcw2)


Lesenswert?

Hör auf Thorsten und nimm std::vector<CLineSegment> als Container für 
deine Linien, oder falls das Polygon ein Polygon sein soll, dann besteht 
es eigentlich aus (Eck-)Punkten und nicht aus einer unkoordinierten 
Sammlung von Linien.

von Arc N. (arc)


Lesenswert?

Carl D. schrieb:
> Hör auf Thorsten und nimm std::vector<CLineSegment> als Container für
> deine Linien, oder falls das Polygon ein Polygon sein soll, dann besteht
> es eigentlich aus (Eck-)Punkten und nicht aus einer unkoordinierten
> Sammlung von Linien.

Sicher kann die Aufgabe mit std:vector, Lambdas, etc. z.T. deutlich 
einfacher gelöst werden, nur wären die Teilaufgaben dann anders gestellt 
und bspw. m_segments definitiv nicht vom Typ CLineSegment* vorgegeben 
worden.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Arc N. schrieb:

> Sicher kann die Aufgabe mit std:vector, Lambdas, etc. z.T. deutlich
> einfacher gelöst werden, nur wären die Teilaufgaben dann anders gestellt
> und bspw. m_segments definitiv nicht vom Typ CLineSegment* vorgegeben
> worden.

Das stimmt. Tja, was soll ein Student machen, wenn die Aufgabe 
"ungünstig" gestellt ist? Ich würde es "vernünftig" machen und dann 
begründen, warum ich von der Aufgabenstellung abgewichen bin.

Alternativ könnte man natürlich die 2-4 fehlenden "Funktionen" einfach 
privat machen oder deleten.

Letztendlich ist die Aufgabe aber natürlich, die Prüfung zu bestehen.

von Cyblord -. (Gast)


Lesenswert?

Torsten R. schrieb:
> Das stimmt. Tja, was soll ein Student machen, wenn die Aufgabe
> "ungünstig" gestellt ist? Ich würde es "vernünftig" machen und dann
> begründen, warum ich von der Aufgabenstellung abgewichen bin.

Genau bester Ratschlag, einfach mal anders machen als gefordert, ... 
vllt. soll es aber genauso gemacht werden, damit man etwas über manuelle 
Speicherverwaltung lernt oder andere Gründe?
So gesehen könnte er ja auch einfach direkt ne Grafiklib einbinden und 
dieser die Berechnung überlassen, ...

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Abradolf L. schrieb:
> Genau bester Ratschlag, einfach mal anders machen als gefordert, ...
> vllt. soll es aber genauso gemacht werden, damit man etwas über manuelle
> Speicherverwaltung lernt oder andere Gründe?

Kann sein, aber dann müsste er es halt auch richtig/fehlerfrei machen. 
Im Gegensatz zu einer Grafiklib ist std::vector<> Teil von C++.

von Arc N. (arc)


Lesenswert?

Torsten R. schrieb:
> Abradolf L. schrieb:
>> Genau bester Ratschlag, einfach mal anders machen als gefordert, ...
>> vllt. soll es aber genauso gemacht werden, damit man etwas über manuelle
>> Speicherverwaltung lernt oder andere Gründe?
>
> Kann sein, aber dann müsste er es halt auch richtig/fehlerfrei machen.
> Im Gegensatz zu einer Grafiklib ist std::vector<> Teil von C++.

Wieso kann sein? Da steht m_segments ist vom Typ CLineSegment* und in 
Teilaufgabe c) wird gefordert, dass "... die als Parameter übergebene 
Kante in das Array ... " eingefügt und wenn dort kein Platz mehr ist, 
"... das Array vor dem Einfügen ... auf das 1,5-fache" vergrößert werden 
soll. Es geht bei solchen Aufgaben nicht darum die eleganteste, 
wartbarste und sicherste Lösung zu finden, sondern darum, ob die 
grundlegenden Konzepte, zu denen in C++ eben auch die manuelle 
Speicherverwaltung zählt, verstanden wurden und angewandt werden können. 
Wer das schon vorher kennt findet solche Aufgaben langweilig, ärgerlich, 
was auch immer, hilft nur nichts, da nicht alle denselben Wissensstand 
haben...
Bleibt "nur" die Frage, wie hier am besten der Weg zu einer richtigen 
Lösung aufgezeigt werden kann ohne eine gleich eine fertige in den Raum 
zu werfen. Direkte/s Interaktion/Feedback wäre mit Sicherheit besser als 
mit Umweg über ein Forum, aber gut, so dauert's halt etwas länger bis 
zum Aha-Erlebnis.

Zurück zum Thema (ohne fertige Lösungen):
1
void  CPolygon::addEdge(CLineSegment edge) {
2
    for (int m_countSegments = 0; m_countSegments > m_maxSegments; i++) {
3
        if (m_countSegments >= m_maxSegments) {
4
            m_segments[1.5*m_countSegments] = edge;
5
        }
6
        m_segments[m_countSegments] = edge;
7
    }
8
}
1. Wenn der Compiler Fehlermeldungen wirft, ist der Code zumindest 
syntaktisch falsch...
2. Ich würde mir im Konstruktor von CPolygon ansehen wie dort das Array 
m_segments erzeugt wird und dann addEdge nochmal komplett neu anfangen.

von APP I. (mac21)


Lesenswert?

Ja wir haben leider Vector in der Vorlesung nicht gelernt ,daher können 
wir es auch nicht anwenden .

Aber ich weiß immer noch nicht was der Fehler bei addEdge ist ?

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Arc N. schrieb:
> Torsten R. schrieb:
>> Abradolf L. schrieb:
>>> Genau bester Ratschlag, einfach mal anders machen als gefordert, ...
>>> vllt. soll es aber genauso gemacht werden, damit man etwas über manuelle
>>> Speicherverwaltung lernt oder andere Gründe?
>>
>> Kann sein, aber dann müsste er es halt auch richtig/fehlerfrei machen.
>> Im Gegensatz zu einer Grafiklib ist std::vector<> Teil von C++.
>
> Wieso kann sein?

Weil dass so eine "übliche" Redewendung für "Du magst Recht haben, 
aber..." ist.

> Es geht bei solchen Aufgaben nicht darum die eleganteste,
> wartbarste und sicherste Lösung zu finden, sondern darum, ob die
> grundlegenden Konzepte, zu denen in C++ eben auch die manuelle
> Speicherverwaltung zählt, verstanden wurden und angewandt werden können.

Das ist ja das Ärgerliche. Ich mache seit 20 Jahren jeden Tag C++ und 
was brauche ich da am aller, aller wenigsten? Richtig manuelle 
Speicherverwaltung!

Sicher muss man das irgend wann mal gemacht haben. Aber dann kann man 
die Studenten doch einfach einmal std::vector implementieren lassen. 
Wenn der später soetwas im Job macht, wird er sofort wieder entlassen.

Ich habe doch oben geschrieben, dass ich einsehe, dass das Nahziel des 
Studenten sein sollte, die Prüfung zu bestehen. Es wird doch aber noch 
darauf hin gewiesen werden dürfen, dass der gezeigte Code Fehler 
enthält.

> Bleibt "nur" die Frage, wie hier am besten der Weg zu einer richtigen
> Lösung aufgezeigt werden kann ohne eine gleich eine fertige in den Raum
> zu werfen.

Deine direkte Antwort hatte doch schon den Tippfehler aufgezeigt. Wenn 
der OP wirklich Hilfe haben wollte, dann würde er ja zumindest mal den 
Code anständig formatieren. Und eine konkrete Frage stellen. So zeigt er 
nur falsche Code-Schnipsel und hofft, dass Ihm das jemand heil macht.

> 2. Ich würde mir im Konstruktor von CPolygon ansehen wie dort das Array
> m_segments erzeugt wird und dann addEdge nochmal komplett neu anfangen.

Ja, und wenn er schon dabei ist, den c'tor zu überarbeiten. In C++ gibt 
es eine Initialisierungsliste, die man nutzen sollte ;-)
1
CPolygon::CPolygon(unsigned int initialSize)
2
  : m_maxSegments( std::max( initialSize, 10u ) )
3
  , m_countSegments( 0 )
4
  , m_segments( new CLineSegment[ m_maxSegments ] )
5
{
6
}

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

APP I. schrieb:
1
void  CPolygon::addEdge(CLineSegment edge)
2
{
3
    for (int m_countSegments =0; m_countSegments>m_maxSegments; i++)
4
    {
5
        if(m_countSegments>= m_maxSegments){
6
            m_segments[1.5*m_countSegments] = edge;
7
        }
8
9
        m_segments[m_countSegments] = edge;
10
    }
11
}

> Passt der Code jetzt besser ?

Was glaubst Du den, was der gezeigt Code macht? (Zeile für Zeile)

von APP I. (mac21)


Lesenswert?

void  CPolygon::addEdge(CLineSegment edge)
{
    for (int m_countSegments =0; m_countSegments<m_maxSegments; i++)
    {
        if(m_countSegments>= m_maxSegments){
            m_segments[1.5*m_countSegments] = edge;
        }

        m_segments[m_countSegments] = edge;
    }
}

Hatte ein falsches Vorzeichen drin bei der for Schleife , aus meiner 
Sichti richtig ?

Solange das countSegment kleiner ist , also noch Speicher frei ist läuft 
die for Schleife .

Wenn der Speicherplatz überschritten ist wird der Speicherplatz um 1.5 
erhöht .

Der letze Teil :

Edge an die erste Stelle des Array

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

APP I. schrieb:
> void  CPolygon::addEdge(CLineSegment edge)
> {
>     for (int m_countSegments =0; m_countSegments<m_maxSegments; i++)
>     {
>         if(m_countSegments>= m_maxSegments){
>             m_segments[1.5*m_countSegments] = edge;
>         }
>
>         m_segments[m_countSegments] = edge;
>     }
> }
>
> Hatte ein falsches Vorzeichen drin bei der for Schleife , aus meiner
> Sichti richtig ?

Ok, fangen wir noch früher an:

Wofür ist die member Variable m_maxSegments da?
Wofür ist die member Variable m_countSegments da?
Wofür ist die member Variable m_segments da?

von APP I. (mac21)


Lesenswert?

Wofür ist die member Variable m_maxSegments da?

Anzahl des maximalen Speicherplatzes
Wofür ist die member Variable m_countSegments da?

beginnt bei 0 , erste Stelle
Wofür ist die member Variable m_segments da?
array name

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

APP I. schrieb:
> Wofür ist die member Variable m_maxSegments da?
>
> Anzahl des maximalen Speicherplatzes

Richtig, Größe des dynamisch erzeugten Arrays und damit also die Menge 
der CLineSegment die in dem Array, auf dessen erstes Element m_segments 
zeigt, gespeichert sind. Du hast also immer ein Array mit m_maxSegments 
CLineSegment. Oder anders herum m_segments zeigt immer auf eine Array 
der Länge m_maxSegments.

Initalisiert wurden die mit dem default constructor.

> Wofür ist die member Variable m_countSegments da?
>
> beginnt bei 0 , erste Stelle

Ne, dass ist keine Position (zumindest nicht explitzit). Das ist die 
Anzahl der Kanten, die Du in dem Array (auf das m_segments zeigt) 
abgelegt hast. Schöne Analogie für Arrays sind Regale (die mit den 
großen Fächern von Ikea). Du hast also ein Regal mit m_maxSegments 
Fächern. Du räumst jetzt auf und packst eine Kante nach der anderen in 
das Regal. m_countSegments ist die Anzahl der Kanten, die Du schon in 
das Regal gepackt hast.

Und was machst Du jetzt, wenn das Regal schon voll ist, wenn Du eine 
neue kante hinein packen möchtest? Falsch ;-).

Nein, Du stellst kein neues Regal gleicher Größe daneben, sondern kaufst 
Dir ein um 50% größeres Regal, räumst die Elemente aus dem alten Regal 
in das neue Regal und wirfst das alte Regal weg.

von APP I. (mac21)


Lesenswert?

Hab es mal bisschen überarbeitet ?
Aber was soll ich jetzt genau löschen?
1
void  CPolygon::addEdge(CLineSegment edge)
2
 {
3
     for (int m_countSegments =0; m_countSegments<m_maxSegments; i++)
4
    {
5
       if(m_countSegments>= m_maxSegments){
6
            m_segments = new CLineSegment [1.5*m_countSegments];
7
        m_segments = edge;
8
         }
9
10
         m_segments[m_countSegments] = edge;
11
     }
12
}

Warum muss ich eigentlich ein neues Regal bauen ?

Habe ich das Regal richtig gebaut?

von asdfasd (Gast)


Lesenswert?

Ich bin mal direkt: Du hast keinen blassen Schimmer was du da machst. 
Und nicht nur bezgl der Aufgabenstellung - es fehlt ein grundlegendes 
Verständnis des Programmierens.  Setz dich hin und pauke; fang vorne an, 
bei den Grundlagen; probier die Aufgaben praktisch aus; verstehe sie, 
nicht nur auswendig lernen.  Und erwarte nicht, dass das an einem 
Wochenende erledigt ist ...

von APP I. (mac21)


Lesenswert?

Naja ich hatte ja paar Probleme beim implementieren gehabt und hatte 
daher auch die Frage im Forum gepostet .

Hatte bisschen Hilfe erwartet , da ich nicht weiter gekommen bin .
Ich verstehe auch nicht was an meinem Ansatz jetzt falsch ist ?

von APP I. (mac21)


Lesenswert?

Ist noch jemand da ?

von nicht"Gast" (Gast)


Lesenswert?

nö, keiner hier ;)

Dein Code ist immer noch Mist.

1. m_countSegments kann nie größer als m_maxSegments werden, weil du ja 
nur bis kleiner zählst. Daher wird deine Bedingung nie erfüllt werden. 
(zum Glück)

2. Du schmeißt in deiner Bedingung einfach den Zeiger auf vorhanden 
Speicher weg und willst neuen Anfordern (geht das mit einem float 
überhaupt?). Damit erzeugst du einen netten Memory Leak.

3. Der Name deiner Funktion klingt jetzt nicht, als wenn du Edge auf 
alle Elemente kopieren willst. Genau das machst du aber.

von Arc N. (arc)


Lesenswert?

APP I. schrieb:
> Hab es mal bisschen überarbeitet ?
> Aber was soll ich jetzt genau löschen?
1
void  CPolygon::addEdge(CLineSegment edge)
2
{
3
    // Kompiliert nicht. Warum (mehrere Gründe)?
4
    for (int m_countSegments =0; m_countSegments<m_maxSegments; i++)
5
    {
6
      // Passt, aber gehört nicht hier hin. Warum?        
7
      if (m_countSegments>= m_maxSegments){
8
         // das gibt eine Warnung (warum?) und wirft die bisher
9
         // in m_segments eingefügten Segmente weg... 
10
         m_segments = new CLineSegment [1.5*m_countSegments];
11
         // kompiliert auch nicht
12
         m_segments = edge;
13
      }          
14
      m_segments[m_countSegments] = edge;
15
    }
16
}
>
> Warum muss ich eigentlich ein neues Regal bauen ?
>
> Habe ich das Regal richtig gebaut?

> Aber was soll ich jetzt genau löschen?

Viel
1
void  CPolygon::addEdge(CLineSegment edge) {
2
    // Falls kein Speicherplatz mehr vorhanden ist, vergrößert sie das
3
    // Array vor dem Einfügen des übergebenen Segments auf das 1,5-fache
4
    if (m_countSegments >= m_maxSegments) {  
5
       unsigned int newMaxSegments = ...;        
6
       ...
7
    } 
8
    m_segments[m_countSegments] = edge;
9
    m_countSegments++;
10
}

Beitrag #5231322 wurde von einem Moderator gelöscht.
von mac33 (Gast)


Lesenswert?

void  CPolygon::addEdge(CLineSegment edge) {
    // Falls kein Speicherplatz mehr vorhanden ist, vergrößert sie das
    // Array vor dem Einfügen des übergebenen Segments auf das 1,5-fache
    if (m_countSegments >= m_maxSegments) {
       unsigned int newMaxSegments = new CLineSegment 
[1.5*m_maxSegment];
       ...
    }
    m_segments[m_countSegments] = edge;
    m_countSegments++;
}

Das zeigt mir natürlich leider Fehler an , wo ich den neuen Speicher 
anlege.

hmm.

Ich muss doch mit new einen neuen Speicher anlegen oder ?

Verstehe nicht wie ich sonst den Speicher ändern könnte?

von Arc N. (arc)


Lesenswert?

mac33 schrieb:
> void  CPolygon::addEdge(CLineSegment edge) {
>     // Falls kein Speicherplatz mehr vorhanden ist, vergrößert sie das
>     // Array vor dem Einfügen des übergebenen Segments auf das 1,5-fache
>     if (m_countSegments >= m_maxSegments) {
>        unsigned int newMaxSegments = new CLineSegment
> [1.5*m_maxSegment];
>        ...
>     }
>     m_segments[m_countSegments] = edge;
>     m_countSegments++;
> }
>
> Das zeigt mir natürlich leider Fehler an , wo ich den neuen Speicher
> anlege.
>
> hmm.
>
> Ich muss doch mit new einen neuen Speicher anlegen oder ?

Ja.

> Verstehe nicht wie ich sonst den Speicher ändern könnte?

newMaxSegments ist vom Typ unsigned int und ist nicht ohne Grund ähnlich 
wie m_maxSegments benannt.
m_segments dagegen vom Typ CLineSegment*.
Passt also
1
unsigned int newMaxSegments = new CLineSegment[1.5*m_maxSegment];

von mac33 (Gast)


Lesenswert?

Ich habe es jetzt so implementiert ,aber es werden mir Fehler angezeigt:
Description  Resource  Path  Location  Type
array subscript is not an integer  CPolygon.cpp  /CLineSegment  line 32 
C/C++ Problem
1
void  CPolygon::addEdge(CLineSegment edge) {
2
    // Falls kein Speicherplatz mehr vorhanden ist, vergrößert sie das
3
    // Array vor dem Einfügen des übergebenen Segments auf das 1,5-fache
4
    if (m_countSegments >= m_maxSegments) {
5
       unsigned int newMaxSegments = m_segments[1.5*m_maxSegments];
6
       newMaxSegments[1.5*m_countSegments] = edge;
7
    }
8
    m_segments[m_countSegments] = edge;
9
    m_countSegments++;
10
}

Bitte um Hilfe

von Arc N. (arc)


Lesenswert?

mac33 schrieb:
> Ich habe es jetzt so implementiert ,aber es werden mir Fehler angezeigt:
> Description  Resource  Path  Location  Type
> array subscript is not an integer  CPolygon.cpp  /CLineSegment  line 32
> C/C++ Problem
1
void  CPolygon::addEdge(CLineSegment edge) {
2
    // Falls kein Speicherplatz mehr vorhanden ist, vergrößert sie das
3
    // Array vor dem Einfügen des übergebenen Segments auf das 1,5-fache
4
    if (m_countSegments >= m_maxSegments) {
5
       // Was ist in m_segments gespeichert? unsigned int oder CLineSegment?       
6
       // Was kommt bei 1.5*m_maxSegments raus? int oder was anderes?  
7
       unsigned int newMaxSegments = m_segments[1.5*m_maxSegments];
8
       // Kann das passen? 
9
       newMaxSegments[1.5*m_countSegments] = edge;
10
       // Im Konstruktor wurde m_segments = new CLineSegment [m_maxSegments] verwendet, 
11
       // um ein neues, leeres Array mit Platz 
12
       // für m_maxSegments Elemente vom Typ CLineSegment zu erzeugen
13
       // und es m_segments zuzuweisen.  
14
       // D.h. wenn das Array vergrößert werden soll ohne das die vorher 
15
       // darin eingefügten Elemente weggeworfen werden sollen,
16
       // wird erst mal ein temporäres, leeres ... gebraucht.
17
       // Dann müssen die ... ... ... werden.
18
       // Und danach ... das temporäre Array ... werden.     
19
    }
20
    // Die beiden Zeilen bleiben so
21
    m_segments[m_countSegments] = edge;
22
    m_countSegments++;
23
}

> Bitte um Hilfe

von mac33 (Gast)


Lesenswert?

void  CPolygon::addEdge(CLineSegment edge) {
    // Falls kein Speicherplatz mehr vorhanden ist, vergrößert sie das
    // Array vor dem Einfügen des übergebenen Segments auf das 1,5-fache
    if (m_countSegments >= m_maxSegments) {
       // Was ist in m_segments gespeichert? unsigned int oder 
CLineSegment?
       // Was kommt bei 1.5*m_maxSegments raus? int oder was anderes?
       unsigned int newMaxSegments = CLineSegment [1.5*m_maxSegments];
       // Kann das passen?
       newMaxSegments[1.5*m_countSegments] = edge;
       unsigned  int temp[i];

       // D.h. wenn das Array vergrößert werden soll ohne das die vorher
       // darin eingefügten Elemente weggeworfen werden sollen,
       // wird erst mal ein temporäres, leeres ... gebraucht.
       // Dann müssen die ... ... ... werden.
       // Und danach ... das temporäre Array ... werden.
    }
    // Die beiden Zeilen bleiben so
    m_segments[m_countSegments] = edge;
    m_countSegments++;
}

Ich habe nur ein wenig implementiert , da diese Aufgabe wohl doch nicht 
so trivial ist wie ich dachte.



Brauche ich eigentlich ne for schleife für das tmp array?

von Arc N. (arc)


Lesenswert?

mac33 schrieb:
> void  CPolygon::addEdge(CLineSegment edge) {
>     // Falls kein Speicherplatz mehr vorhanden ist, vergrößert sie das
>     // Array vor dem Einfügen des übergebenen Segments auf das 1,5-fache
>     if (m_countSegments >= m_maxSegments) {
>        // Was ist in m_segments gespeichert? unsigned int oder
> CLineSegment?
>        // Was kommt bei 1.5*m_maxSegments raus? int oder was anderes?
>        unsigned int newMaxSegments = CLineSegment [1.5*m_maxSegments];
>        // Kann das passen?
>        newMaxSegments[1.5*m_countSegments] = edge;
>        unsigned  int temp[i];
>
>        // D.h. wenn das Array vergrößert werden soll ohne das die vorher
>        // darin eingefügten Elemente weggeworfen werden sollen,
>        // wird erst mal ein temporäres, leeres ... gebraucht.
>        // Dann müssen die ... ... ... werden.
>        // Und danach ... das temporäre Array ... werden.
>     }
>     // Die beiden Zeilen bleiben so
>     m_segments[m_countSegments] = edge;
>     m_countSegments++;
> }
>
> Ich habe nur ein wenig implementiert , da diese Aufgabe wohl doch nicht
> so trivial ist wie ich dachte.

Kompiliert das? Nein... unsigned int ist nicht CLineSegment...
Was hoffentlich auch im Skript/Buch erklärt ist, wenn nicht: ab in die 
Tonne damit und/oder Uni/Dozent wechseln.
Wenn im Konstruktor die Lösung für das Original-Array steht,
1
m_segments = new CLineSegment[m_maxSegments];
wie würde das für ein weiteres Array mit der neuen Größe aussehen?
Danach folgt dann
> Brauche ich eigentlich ne for schleife für das tmp array?
Ja.

von mac33 (Gast)


Lesenswert?

Du hattest ja anders  geschrieben :
Daher ware ich irritiert .
Ich würde es eigenltich so machen:

 newMaxSegments = new CLineSegment [1.5*m_maxSegments];

von Arc N. (arc)


Lesenswert?

mac33 schrieb:
> Du hattest ja anders  geschrieben :
> Daher ware ich irritiert .
> Ich würde es eigenltich so machen:
>
>  newMaxSegments = new CLineSegment [1.5*m_maxSegments];

Dann
- müsste newMaxSegments von welchem Typ sein?
- wäre newMaxSegments dann eine passende Bezeichnung?

So ging's los
1
void  CPolygon::addEdge(CLineSegment edge) {
2
    // Falls kein Speicherplatz mehr vorhanden ist, vergrößert sie das
3
    // Array vor dem Einfügen des übergebenen Segments auf das 1,5-fache
4
    if (m_countSegments >= m_maxSegments) {  
5
       unsigned int newMaxSegments = ...;        
6
       ...
7
    } 
8
    m_segments[m_countSegments] = edge;
9
    m_countSegments++;
10
}

Danach kam:
> newMaxSegments ist vom Typ unsigned int und ist nicht ohne Grund ähnlich
> wie m_maxSegments benannt.
> m_segments dagegen vom Typ CLineSegment*.
> Passt also
> unsigned int newMaxSegments = new CLineSegment[1.5*m_maxSegment];

Sinnvoll wäre es, wenn der Code zumindest ohne Fehler und Warnungen 
durch den Compiler geht...
1
void  CPolygon::addEdge(CLineSegment edge) {
2
    // Falls kein Speicherplatz mehr vorhanden ist, vergrößert sie das
3
    // Array vor dem Einfügen des übergebenen Segments auf das 1,5-fache
4
    if (m_countSegments >= m_maxSegments) {  
5
       unsigned int newMaxSegments = ...;        
6
       CLineSegment* ... = ...;
7
       // Was fehlt jetzt noch?
8
    } 
9
    m_segments[m_countSegments] = edge;
10
    m_countSegments++;
11
}

: Bearbeitet durch User
von asdfasd (Gast)


Lesenswert?

Ich frag mich ja, ob ihr auch einem angehenden Arzt dabei helfen würdet, 
sich durch ne Prüfung zu mogeln.

Ihr helft dem TE nicht, etwas zu lernen, denn für das Verständnis der 
Hinweise fehlem ihm die Grundlagen. Das einzige was ihr macht, ist, ihm 
beim Bescheißen zu helfen.

von Arc N. (arc)


Lesenswert?

asdfasd schrieb:
> Ich frag mich ja, ob ihr auch einem angehenden Arzt dabei helfen würdet,
> sich durch ne Prüfung zu mogeln.

Wenn Patienten wüssten mit wie wenig Stoffverständnis einige Ärzte 
durchs Physikum gekommen sind...

> Ihr helft dem TE nicht, etwas zu lernen, denn für das Verständnis der
> Hinweise fehlem ihm die Grundlagen. Das einzige was ihr macht, ist, ihm
> beim Bescheißen zu helfen.

Das ist die Frage... Wenn als nächstes etwas nicht kompilierbares 
und/oder Warnungen enthaltendes käme, würde ich definitiv "Zurück auf 
Start" empfehlen.

von APP I. (mac21)


Lesenswert?

unsigned int newMaxSegments = ...;

Besser ich frage vorher nach .

Soll ich jetzt auf der rechten Seite ein temp Array erstellen ?
Das macht man ja mit new ?

Aber wie soll es dann heissen ?

unsigned int newMaxSegments = new unsigned int [1,5*m_maxSegments];
Aber das kompiliert verdammt nicht .

von nicht"Gast" (Gast)


Lesenswert?

APP I. schrieb:

> unsigned int newMaxSegments = new unsigned int [1,5*m_maxSegments];
> Aber das kompiliert verdammt nicht .

Und was sagt der Compiler dazu? Der gibt so komische Hinweise drauf, 
warum er was nicht machen mag.

von Oliver S. (oliverso)


Lesenswert?

Und was sagt die Doku zu new darüber, was genau new zurückgibt?

Oliver

von APP I. (mac21)


Lesenswert?

Mit new kann man neuen Speicher anlegen .

Leider drehe ich mich hier irgendwie im Kreis

von mac33 (Gast)


Lesenswert?

Möchte es nochmal jemand versuchen mir zu erklären ?

von tictactoe (Gast)


Lesenswert?

Ich hätte gerne geholfen. Aber was ich bisher so gesehen habe, ist es 
für alle Seiten wohl wesentlich Nerven schonender, wenn du deinem 
Lieblings-Nerd von der Nebenstraße eine Pizza anbietest und der dir im 
Gegenzug bei der Sache über die Schulter schaut.

von APP I. (mac21)


Lesenswert?

1
#include<iostream>
2
#include <string>
3
#include "CPolygon.h"
4
using namespace std;
5
6
#include"CLineSegment.h"
7
8
CPolygon::CPolygon(unsigned int initialSize){
9
10
    m_maxSegments = initialSize;
11
  if(initialSize <3){
12
    m_maxSegments = 10;
13
  }
14
  m_segments = new CLineSegment [m_maxSegments];
15
16
17
}
18
19
CPolygon::~CPolygon(){
20
21
   delete[] m_segments;
22
}
23
void  CPolygon::addEdge(CLineSegment edge) {
24
    // Falls kein Speicherplatz mehr vorhanden ist, vergrößert sie das
25
    // Array vor dem Einfügen des übergebenen Segments auf das 1,5-fache
26
    if (m_countSegments >= m_maxSegments) {
27
       CLineSegment* newMaxSegments = new CLineSegment [1,5*m_maxSegments];
28
       for(int i = 0; i<m_maxSegments; i++){
29
       newMaxSegments[i]= m_segments[i];
30
       m_segments = newMaxSegments;
31
       }
32
33
    }
34
    m_segments[m_countSegments] = edge;
35
    m_countSegments++;
36
}
37
38
float CPolygon::sumOfLenghts(){
39
  float summe = 0.0f;
40
  for (int i = 0; i< this->m_maxSegments; i++){
41
42
    summe += m_segments[i].length();
43
44
  }
45
46
return summe;
47
}
48
void  CPolygon::print(){
49
50
  cout << " Polygon mit Kante:" << endl;
51
  for (int i=0; i<m_maxSegments ;i++){
52
  cout << m_segments[i] << endl;
53
54
      cout << " Summer der Kantenlänge:  " << CPolygon::sumOfLenghts() ;
55
  }
56
57
}
58
59
bool CPolygon::isValid(){
60
61
  if(m_segments == 3 ){
62
63
64
65
  }
66
67
68
  }
69
70
bool CPolygon::isSimple(){
71
  for ( int i = 0; i<m_segments[i].Intersects(m_segments[i]);i++){
72
73
    for ( int j = i+1; j<m_segments[i+1].Intersects(m_segments[i+1]);j++){
74
75
    if(m_segments[i].Intersects(m_segments[j])) {
76
77
    return true;
78
    }
79
    else{
80
81
      return false;
82
    }
83
    }
84
    }
85
86
87
88
89
90
91
92
93
94
  }
95
96
97
98
}

Ein bisschen was habe ich mittlerweile hinbekommen aber bei der Methode 
isSimple und isValid habe ich so meine Probleme.

Bitte um Hilfe falls jemand Lust hat.
Danke

von Arc N. (arc)


Lesenswert?

Das sieht ja schon besser aus
1
void  CPolygon::addEdge(CLineSegment edge) {
2
    // Falls kein Speicherplatz mehr vorhanden ist, vergrößert sie das
3
    // Array vor dem Einfügen des übergebenen Segments auf das 1,5-fache
4
    if (m_countSegments >= m_maxSegments) {
5
       // Es hatte seinen Grund, dass newMaxSegments 
6
       // ursprünglich vom Typ unsigned int 
7
       // und nicht vom Typ CLineSegment war...
8
       // Angenommen dieser Teil hier wurde einmal durchlaufen: 
9
       // Was passiert wenn die nächste Kante hinzugefügt wird?
10
       // Anders gefragt: Was hat dieser Teil vergessen?
11
       CLineSegment* newMaxSegments = new CLineSegment [1,5*m_maxSegments];
12
       for (int i = 0; i<m_maxSegments; i++) {
13
           newMaxSegments[i]= m_segments[i];
14
           // Zwar nicht verkehrt, aber es reicht wenn m_segments  
15
           // einmal nach der Schleife passend gesetzt wird ;)
16
           m_segments = newMaxSegments;
17
       }
18
       
19
    }
20
    m_segments[m_countSegments] = edge;
21
    m_countSegments++;
22
}
aber wirft immer noch Warnungen. Falls der gcc genutzt wird: Generell 
mit -Wall -Werror und wer mag auch gleich mit -Wextra übersetzen (es ist 
nicht nur an einigen Unis üblich, dass es Punktabzüge für Warnungen 
gibt)

von APP I. (mac21)


Lesenswert?

Das Array als unsigned int gibt aber error aus.

Das Problem ist das dass eine alte Klausur Aufgabe ist an der ich übe 
und bei der muss das Header so bleiben wie es ist .

Hast du ne Idee wie ich die Methode is simple noch ein wenig korrigieren 
kann ?

von Kaleun Schniedelwitz (Gast)


Lesenswert?

Abgesehen von möglichen anderen Fehlern: Denke einmal genau über diese 
Zeile nach:
1
CLineSegment* newMaxSegments = new CLineSegment [1,5*m_maxSegments];
1
1   ,   5   *   m_maxSegments

von mac33 (Gast)


Lesenswert?

Ja da sollte man 1.5 schreiben .
Aber halb so schlimm .

Ich warte weiter auf tipps?

von Carl D. (jcw2)


Lesenswert?

mac33 schrieb:
> Ja da sollte man 1.5 schreiben .
> Aber halb so schlimm .
>
> Ich warte weiter auf tipps?

Statt 50% mehr, 400% mehr.
Kaum der Rede wert und sicher innerhalb der Toleranz
;-)

von APP I. (mac21)


Lesenswert?

Hahah der war gut .

von APP I. (mac21)


Lesenswert?

Hat jemand paar Tipps zu der Implementierung der Methoden ?

von Arc N. (arc)


Lesenswert?

APP I. schrieb:
> Hat jemand paar Tipps zu der Implementierung der Methoden ?

Ja, wenn das ganze (Stand 06.12.2017 17:52) zumindest ohne Warnungen und 
Fehler vom Compiler übersetzt werden würde...

von APP I. (mac21)


Lesenswert?

Ja ich komme ja nicht auf die Fehler , daher hatte ich ja euch um Hilfe 
gebeten

von Arc N. (arc)


Lesenswert?

APP I. schrieb:
> Ja ich komme ja nicht auf die Fehler , daher hatte ich ja euch um Hilfe
> gebeten

So unverständlich wie vor etlichen Jahren sind die Ausgaben der heutigen 
Compiler nicht mehr. Ansatz: Alles löschen was der Compiler als Fehler 
anmeckert, danach die Stellen mit den Warnungen ausbessern und dann die 
Stellen wo Fehler waren neu schreiben.

von mac33 (Gast)


Lesenswert?

Komischerweise möchten die wenigsten Leute bei programmiertechnischen 
Fragen helfen.

Warum hat man da überhaupt ein Forum aufgemacht ?
Verstehe ich nicht.

Beitrag #5238970 wurde von einem Moderator gelöscht.
von Arc N. (arc)


Lesenswert?

mac33 schrieb:
> Komischerweise möchten die wenigsten Leute bei programmiertechnischen
> Fragen helfen.
>
> Warum hat man da überhaupt ein Forum aufgemacht ?
> Verstehe ich nicht.

APP I. schrieb:
> Ja ich komme ja nicht auf die Fehler , daher hatte ich ja euch um Hilfe
> gebeten

Was fehlt denn hier? Ferndiagnose: Anscheinend wurde nicht versucht, 
dass durch einen Compiler zu jagen und dann entsprechend das Programm 
anzupassen oder, falls die Fehlermeldungen/Warnungen unverständlich 
sind, entsprechend nachzufragen.
Hinweise was/wo die Fehler sein könnten, gibt's hier im Thread...

von APP I. (mac21)


Lesenswert?

Es wurden hier leider überhaupt keine Hinweise gegeben wie ich die 
Methode isValid oder isSimple implementieren kann .

Mann hätte ja einfach meinen Code korrigieren können.

Ich musste ja die Aufgabe nicht abgeben oder so .

So hat man sich nur im Kreis gedreht

von Carl D. (jcw2)


Lesenswert?

APP I. schrieb:
> Es wurden hier leider überhaupt keine Hinweise gegeben wie ich die
> Methode isValid oder isSimple implementieren kann .
>
> Mann hätte ja einfach meinen Code korrigieren können.
>
> Ich musste ja die Aufgabe nicht abgeben oder so .
>
> So hat man sich nur im Kreis gedreht

Und woraus leiten sich diese Ansprüche ab?

von mac33 (Gast)


Lesenswert?

Mein Ärger hat sich mittlerweile gelegt ,habt ihr nicht paar tips für 
die Methode isValid ?

Was wollen die da von mir?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.