22. august 2009 - 00:41Der er
17 kommentarer og 1 løsning
Fejl ved kommandoer imellem filer
Jeg er igang med at lave noget i C# til at styre en servo controller.
Når jeg sætter alt sammen i det samme program, så fungerer det fint, men det program som jeg pt laver et plugin til, har config i en form, og så selve programmet i en anden. Mit problem er her kommunikation imellem formen, og det som kører i baggrunden.
Fejlen jeg får er denne: Error 6 An object reference is required for the non-static field, method, or property 'ServoController.ServoControl.servoPos(int)'
hvor servoPos ligger i en fil kaldet ServoControl.cs
namespace ServoController { public class ServoControl { public int servoBot = 280;
(en masse klippet ud)
public int servoPos(int channel) { if (channel == 00) return channel00;
(en masse klippet ud hvor den kører igennem flere kanaler)
else return servoBot; } } }
Inde i formen ønsker jeg så at kalde dette
namespace Plugin { public partial class PluginForm : Form { private void channelsUpdate_Tick(object sender, EventArgs e) { progressBar00.Value = ServoController.ServoControl.servoPos(0); } } }
Hvilket man ikke kan, men hvordan kommer jeg så rundt om det? Jeg kan ikke bare lave servoPos om til en static, fordi så kan jeg ikke længere bruge de int som bliver defineret rundt omkring i de andre funktioner.
Nej, er nok også bare et begynder problem. Startede kun med det for en uge siden, og udelukkende lært ved at bruge microsofts side, og så en masse google.
Jeg har også brugt en del tid på at søge efter et svar via google, men problemet er nok at jeg ikke nøjagtigt ved hvad jeg skal søge efter. En søgning på fejlen giver en masse, hvor det meste vist ikke lige hører til det problem jeg har.
Jo, men det ene ligger i namespace: ServoController og den anden i namspace: Plugin
Så 2 muligheder: 1. tilføj using ServoController i toppen af din af din fil hvis du skal bruge dit Servo 2. Angiv det fulde navn: ServoController.ServoControl sControl = new ServoController.ServoControl();
'ServoController.ServoControl' does not contain a definition for 'ServoController' and no extension method 'ServoController' accepting a first argument of type 'ServoController.ServoControl' could be found (are you missing a using directive or an assembly reference?)
Har jeg gjort noget forkert i opbygningen af den class måske?
Her er en del af koden som jeg kalder fra, hvor jeg har klippet de funktioner ud som intet har med dette at gøre
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using SamplePlugin; using System.IO.Ports; using ServoController;
namespace SamplePlugin { public partial class SamplePluginForm : Form { ServoControl sc = new ServoControl(); //Set instance for the ServoControl class
public SamplePluginForm(bool haveLicense, string owner) { InitializeComponent();
Og her er så den anden, hvor jeg igen har klippet alt ud som ikke har med dette at gøre
using System; using System.Collections.Generic; using System.Text; using System.IO.Ports;
namespace ServoController { public class ServoControl { public static SerialPort sp = new SerialPort();
public int servoTop = 1165; public int servoBot = 280;
//Positions of servos stored here int channel00 = 0; int channel01 = 0; int channel02 = 0; int channel03 = 0; int channel04 = 0; int channel05 = 0; int channel06 = 0; int channel07 = 0; int channel08 = 0; int channel09 = 0; int channel10 = 0; int channel11 = 0; int channel12 = 0; int channel13 = 0; int channel14 = 0; int channel15 = 0;
public string SetConnection(string mode, string portNum) { if (mode == "Connect") {
//en masse hvor den åbner porten
} else if (mode == "Disconnect") { if (sp.IsOpen) { sp.Close(); } sp = new SerialPort(); return "Closed"; } else { return "Unexpected mode"; } }
public string SetServo(int channel, int ramp, int position) //Position between 280 and 1170 { string nl = System.Environment.NewLine; string speedTemp = ""; string positTemp = "";
if (!sp.IsOpen) { SetConnection("Connect", "COM3"); sp.Open(); }
if (position > servoTop - 1) { position = servoTop; positTemp = " (limited)"; } else if (position < servoBot - 1) { position = servoBot; positTemp = " (limited)"; } else { positTemp = ""; }
Jeg har ikke linje numre ... så svært for mig at se.
Men på den gode side så har du lært at kigge godt efter hvad ens debugger siger ... det er ens bedste ven og den fortæller næsten altid hvad der er galt ... :-)
Nu kan jeg også selv komme i seng ... orker ikke at lave mere i dag.
// ouiT
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.