|
Hi Dave,
sorry, I was wrong. My latest experiment[^] tells me automatic marshaling works fine.
There typically is no need to use unsafe and fixed keywords for passing arrays from managed to unmanaged world; only when the pointer(s) are kept around after the function returns, they may become invalid and GCHandle should be used.
|
|
|
|
|
are you using stackalloc ? don't.
are you using P/Invoke and DllImport ? if so, this[^] may help.
|
|
|
|
|
I am using DLLImport. I will check out your link.
|
|
|
|
|
Hi spainchaud,
sorry, I was wrong. My latest experiment[^] tells me automatic marshaling works fine.
There typically is no need to use unsafe and fixed keywords for passing arrays from managed to unmanaged world; only when the pointer(s) are kept around after the function returns, they may become invalid and GCHandle should be used.
|
|
|
|
|
I guess I will just have to put som more thought into my problem. Usually I come up with a solution, but it can take days to figure out some problems.
|
|
|
|
|
I have solved the problem. Thanks for everyone's help. The hint to the solution was the Wikipedia article on how to create a stack overflow. The example code they gave was:
int main(void) {
double n[10000000];
return 0;
}
When I got to work today, and started tracing the overflow, I found this code in my Fortran DLL.
COMPLEX*16 hxx(nstep*nrec*ntrn), hxy(nstep*nrec*ntrn), hxz(nstep*nrec*ntrn)
COMPLEX*16 hyx(nstep*nrec*ntrn), hyy(nstep*nrec*ntrn), hyz(nstep*nrec*ntrn)
COMPLEX*16 hzx(nstep*nrec*ntrn), hzy(nstep*nrec*ntrn), hzz(nstep*nrec*ntrn)
I realized I was putting these huge arrays on the stack. My new working code is:
COMPLEX*16, ALLOCATABLE :: hxx(:), hxy(:), hxz(:)
COMPLEX*16, ALLOCATABLE :: hyx(:), hyy(:), hyz(:)
COMPLEX*16, ALLOCATABLE :: hzx(:), hzy(:), hzz(:)
ALLOCATE(hxx(nstep*nrec*ntrn), hxy(nstep*nrec*ntrn), hxz(nstep*nrec*ntrn))
ALLOCATE(hyx(nstep*nrec*ntrn), hyy(nstep*nrec*ntrn), hyz(nstep*nrec*ntrn))
ALLOCATE(hzx(nstep*nrec*ntrn), hzy(nstep*nrec*ntrn), hzz(nstep*nrec*ntrn))
Thanks to the discussions here, I found the problem very quickly.
|
|
|
|
|
Hi all,
Hope someone can point me in the right direction.
I have a foreach loop that is pinging each COM port for a valid device that may be connected. I will eventually put this in a try-catch, but for now I'm just trying to determine how to create an array based upon the loop and then return that array to be used for generating a collection in a list box. Please see the code below: Also, a generic question...can a function return different data types eg. string, double, etc.
private string[] GetSerialDevice()
{
strPorts = SerialPort.GetPortNames();
foreach (string strPort in strPorts)
{
serialPort1 = new SerialPort(strPort, 115200, Parity.None, 8, StopBits.One);
serialPort1.Handshake = Handshake.None;
serialPort1.Close();
serialPort1.ReadTimeout = 500;
serialPort1.WriteTimeout = 500;
serialPort1.Open();
serialPort1.WriteLine("!001:USR1?\r");
string strUSR1Return = serialPort1.ReadTo("\r");
if (strUSR1Return == "+2.000000")
{
serialPort1.WriteLine("!001:SERL?\r");
string strSerialLow = serialPort1.ReadTo("\r");
serialPort1.WriteLine("!001:SERH?\r");
string strSerialHigh = serialPort1.ReadTo("\r");
double dblSerialNumber = double.Parse(strSerialHigh) * 65536 + double.Parse(strSerialLow);
Console.WriteLine("On" + " " + strPort + " " + "there is a valid amplifier with S/N "
+ dblSerialNumber.ToString());
}
}
serialPort1.Close();
return strPorts;
|
|
|
|
|
mprice214 wrote: can a function return different data types eg. string, double, etc.
yes why not.
What is your question ?
I am not getting exactly.
can you please more elaborate ?
Thank you
Life's Like a mirror. Smile at it & it smiles back at you.- P Pilgrim
So Smile Please
|
|
|
|
|
GetSerialDevice() at the moment returns a string array "strPorts". This is straight forward to me. If I have multiple devices connected to multiple COM ports, in the if loop inside the foreach loop, the double dblSerialNumber would generate a double for each device that is connected to the COM ports. What I don't know how to do would be to have dblSerialNumber as an array which would be made up of each dblSerialNumber that is generated by each pass of the foreach loop. Does that help?
|
|
|
|
|
You can use a Generic List or a Collection instead of an array and then use its Add method.
mprice214 wrote: can a function return different data types eg. string, double, etc.
A single method, no. You can have out parameters to return multiple values from a method.
|
|
|
|
|
I'm not familiar with that, but will look into it.
|
|
|
|
|
mprice214 wrote: return that array
Don't. Create a List and use its AsReadOnly property to return an IList.
|
|
|
|
|
PIEBALDconsult wrote: Don't. Create a List and use its AsReadOnly property to return an IList.
Can you elaborate as to why this would be better?
|
|
|
|
|
|
In two sentences or less?
|
|
|
|
|
I googled and binged and asked, but could not a find a perfect example on how to do this.
So, I gave it all I had.
I am trying to watermark a FLV video. I came across a forum that said you can use ffmpeg to do it. So, I looked around and got an idea of what I was going to do to get this to work.
The problem is that the below code does not work. Meaning that it does not watermark an image.
Process process = new Process();<br />
process.StartInfo.UseShellExecute = false;<br />
process.StartInfo.RedirectStandardInput = true;<br />
process.StartInfo.RedirectStandardError = true;<br />
process.StartInfo.CreateNoWindow = true;<br />
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;<br />
process.StartInfo.FileName = "C:\ffmpeg\ffmpeg.exe";<br />
process.StartInfo.Arguments = "ffmpeg -y -i ‘C:\video.flv’ -vhook ‘C:\ffmpeg\ffmpeg.exe' -f C:\Image.gif";<br />
process.Start();<br />
Thanks,
Harsimran Singh
1) The good news about computers is that they do what you tell them to do. The bad news is that they do what you tell them to do. - Ted Nelson
2) Why is it drug addicts and computer afficionados are both called users? - Clifford Stoll
3) The real danger is not that computers will begin to think like men, but that men will begin to think like computers. - Sydney J. Harris
(Computer code: 00001111 - translation: Hello! :P )
REMEMBER:
"Computers are made for us, we are not made for th
|
|
|
|
|
Hi,
That look's to be a very strange set of arguments. Does it work from the command prompt, i.e. this command line
C:\ffmpeg\ffmpeg.exe ffmpeg -y -i ‘C:\video.flv’ -vhook ‘C:\ffmpeg\ffmpeg.exe' -f C:\Image.gif
Alan.
|
|
|
|
|
hello i have tried but it gives this output
C:\Documents and Settings\jay>D:\Data\Project\Project\Builds\ffmpeg-r25512\bin\f
fmpeg.exe ffmpeg -y -i 'D:\Data\Project\Project\Builds\ffmpeg-r25512\bin\Demo.mp
4' -vhook D:\Data\Project\Project\Builds\ffmpeg-r25512\bin\ffmpeg.exe'-f D:\Data
\Project\Project\Builds\ffmpeg-r25512\bin\tttt.jpg
FFmpeg version SVN-r25512, Copyright (c) 2000-2010 the FFmpeg developers
built on Oct 18 2010 04:06:45 with gcc 4.4.2
configuration: --enable-gpl --enable-version3 --enable-libgsm --enable-pthread
s --enable-libvorbis --enable-libtheora --enable-libspeex --enable-libmp3lame --
enable-libopenjpeg --enable-libschroedinger --enable-libopencore_amrwb --enable-
libopencore_amrnb --enable-libvpx --arch=x86 --enable-runtime-cpudetect --enable
-libxvid --enable-libx264 --extra-libs='-lx264 -lpthread' --enable-librtmp --ext
ra-libs='-lrtmp -lpolarssl -lws2_32 -lwinmm' --target-os=mingw32 --enable-avisyn
th --cross-prefix=i686-mingw32- --cc='ccache i686-mingw32-gcc' --enable-memalign
-hack
libavutil 50.32. 3 / 50.32. 3
libavcore 0. 9. 1 / 0. 9. 1
libavcodec 52.92. 0 / 52.92. 0
libavformat 52.83. 0 / 52.83. 0
libavdevice 52. 2. 2 / 52. 2. 2
libavfilter 1.52. 0 / 1.52. 0
libswscale 0.12. 0 / 0.12. 0
Unable to find a suitable output format for 'ffmpeg'
so what is it ?
please help me
|
|
|
|
|
Hi All,
I have a very basic windows applications form working.
I would like to add this public function so that I can call it in the form code.
public static DateTime PauseForMilliSeconds( int MilliSecondsToPauseFor )<br />
{<br />
<br />
<br />
System.DateTime ThisMoment = System.DateTime.Now ;<br />
System.TimeSpan duration = new System.TimeSpan( 0, 0, 0, 0, MilliSecondsToPauseFor ) ;<br />
System.DateTime AfterWards = ThisMoment.Add( duration ) ;<br />
<br />
<br />
while ( AfterWards >= ThisMoment )<br />
{<br />
System.Windows.Forms.Application.DoEvents() ;<br />
ThisMoment = System.DateTime.Now ;<br />
}<br />
<br />
<br />
return System.DateTime.Now ;<br />
}<br />
<br />
Where do I paste this function so I can call it on the windows form.
How do I add files with functions to my code.... do I have to encapsulate them in a class?
Thanks in advance
Joe
|
|
|
|
|
What is that code supposed to do? Disable the form for a certain duration? Instead, set "this.Enabled = false;" and create a timer that sets "this.Enabled = true;"
You can create a button on your form, double click it (that will create a button click event handler), then call the code you have above from that method.
joey_go wrote: How do I add files with functions to my code.... do I have to encapsulate them in a class?
Sounds like you have some reading/Googling to do.
|
|
|
|
|
My application writes some text to a textbox then I will call a 1 second delay (1000 millisecond) then write different data to the textbox.
I'm probably lacking the fundamentals on how to call functions (methods) in C# and where to locate it in the files/classes.
In C I would create the function prototype and the function and then call this function within main().
Calling the function on the form isn't the issue... it's how do I add this function (method) in to my Visual studio 2008 C# Windows form application.
Any clues would be appreciated.
Joe
|
|
|
|
|
joey_go wrote: Calling the function on the form isn't the issue... it's how do I add this function (method) in to my Visual studio 2008 C# Windows form application.
Hi Joe,
I'm still pretty wet behind the ears, but thought I could take a swing. If you select the "view code" button under the Solution Explorer (2nd from right) in the form [design] view or just double click the header of the form, you'll see the code for the form. You have a namespace and then under that probably "public partial class "formName" : Form, followed by an open curly bracket. Your function needs to be somewhere in between the open and closed curly brackets. You can then call it in Form_Load, button_Click, etc.
Please be gentle if I've just wasted your time reading this....
|
|
|
|
|
To answer your direct question, in C# all methods (functions in C) have to be within a class or struct.
To look at a couple of other points, Application.DoEvents is rarely the correct solution. Here you are trying to keep your UI active when in reality it's busy in your while loop.
The correct way to achieve this is to start another thread and do the pause on that, when it completes it can use a callback (event in C#) so it can be acted upon. There are a few controls such as System.Windows.Forms.Timer that have the threading taken care of for you invisibly - it has a property called Interval (measured in milliseconds!) and a Tick event.
using System;
using System.Windows.Forms;
public partial class FormMain : Form
{
private Timer timer;
public FormMain()
{
InitializeComponent();
timer = new Timer();
timer.Enabled = true;
timer.Tick += new EventHandler(timer_Tick);
}
void timer_Tick(object sender, EventArgs e)
{
}
public void Pause(int duration)
{
timer.Interval = duration;
timer.Start();
}
} Inside your form call Pause(...) . If you want the timer to stop after each pause, call timer.Stop(); in the Tick event handler.
Alternatively you could create a thread yourself and implement what you want, something like:
using System;
using System.Threading;
using System.Windows.Forms;
public partial class FormMain : Form
{
public event EventHandler<PauseEndedEventArgs> PauseEnded;
public FormMain()
{
InitializeComponent();
PauseEnded += new EventHandler<PauseEndedEventArgs>(FormMain_PauseEnded);
}
void FormMain_PauseEnded(object sender, PauseEndedEventArgs e)
{
}
public void BeginPause(int duration)
{
Thread thread = new Thread(new ParameterizedThreadStart(DoPause));
thread.IsBackground = true;
thread.Start(duration);
}
private void DoPause(object obj)
{
int duration = (int)obj;
Thread.Sleep(duration);
EndPause();
}
private void EndPause()
{
if (InvokeRequired)
Invoke(new MethodInvoker(EndPause));
else
OnPauseEnded(new PauseEndedEventArgs(DateTime.Now));
}
protected virtual void OnPauseEnded(PauseEndedEventArgs e)
{
EventHandler<PauseEndedEventArgs> eh = PauseEnded;
if (eh != null)
eh(this, e);
}
}
public class PauseEndedEventArgs : EventArgs
{
private DateTime endDateTime;
public PauseEndedEventArgs(DateTime endDateTime)
{
this.endDateTime = endDateTime;
}
public DateTime EndDateTime
{
get { return endDateTime; }
}
}
Inside your form you can call BeginPause(...) and it will do what you want.
DaveIf this helped, please vote & accept answer!
Binging is like googling, it just feels dirtier. (Pete O'Hanlon)
BTW, in software, hope and pray is not a viable strategy. (Luc Pattyn)
modified on Saturday, April 24, 2010 4:14 AM
|
|
|
|
|
Just create a new static class to hold all your static methods. I often have a class called Globals that serves this purpose.
.45 ACP - because shooting twice is just silly ----- "Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "The staggering layers of obscenity in your statement make it a work of art on so many levels." - J. Jystad, 2001
|
|
|
|
|
OK... it's not very good C# code but I ended up using the following code in a console application.
starttime = DateTime.Now.Second;
while (starttime == DateTime.Now.Second) { }
Regs
Joe
|
|
|
|