Как удалить одинаковые строки из массива во 2 измерении?

 
подскажите пожалуйста, как можно удалить из строкового массива одинаковые строки, из 2 измерения , предопределенных функций в MQL4 для этого нет...
с помощью вложенного цикла можно например найти совпадающие значения, получить их индексы или пересчитать, но вот как удалить???
 
"Удалить" - это средство выразить мысль.
На самом деле электронная техника построена на триггерных ячейках, имеющих 2 устойчивых состояния - условный 0 и условная 1. Третьего не дано.

Из этих значений (битов) складываются байты, а из байтов - некоторые значения. Таким образом, значение в ячейке имеется всегда. Удалить ничего нельзя. Речь может идти о том, чтобы сообщить соотв. ячейкам памяти новое содержание, например, всё обнулить.

В случае со строками нуля не бывает, поскольку ноль - это число. Но есть такое понятие, как "ничего".
Я не знаю, поддерживает ли MQL4 это, но в других языках работает. "Ничего"- это две подряд (открывающая и закрывающая) двойные кавычки. Понимать это надо так, что между кавычками вообще-то находится некое строковое выражение. В данном примере это выражение как бы тоже есть, но оно являет собой нечто такое, что соответствует (аналогично) нулю в численных переменных.

Пишется так:
string A="";


Если не получится, то можно записывать пробел:

string A=" ";
 
"Удалить" - это средство выразить мысль.
На самом деле электронная техника построена на триггерных ячейках, имеющих 2 устойчивых состояния - условный 0 и условная 1. Третьего не дано.

Из этих значений (битов) складываются байты, а из байтов - некоторые значения. Таким образом, значение в ячейке имеется всегда. Удалить ничего нельзя. Речь может идти о том, чтобы сообщить соотв. ячейкам памяти новое содержание, например, всё обнулить.

В случае со строками нуля не бывает, поскольку ноль - это число. Но есть такое понятие, как "ничего".
Я не знаю, поддерживает ли MQL4 это, но в других языках работает. "Ничего"- это две подряд (открывающая и закрывающая) двойные кавычки. Понимать это надо так, что между кавычками вообще-то находится некое строковое выражение. В данном примере это выражение как бы тоже есть, но оно являет собой нечто такое, что соответствует (аналогично) нулю в численных переменных.

Пишется так:
string A="";




Спасибо, я почему-то предполагал что строка удаляется со смещением индекса.
не подскажешь что это за ошибка, забивает все логи при старте советника и ничего не работает. это похоже из за массивов.
02:57:07 2003.06.27 05:00 EXPERT v2.0 EURJPY,H1: unlisted error
02:57:07 2003.06.27 05:00 EXPERT v2.0 EURJPY,H1: unlisted error
а вот код:

string RPattern[500,1,1];
int f,s, arrsize = ArraySize(RPattern);

for ( f=1; f <=Bars; f++){ //в этом цикле массив заполняется, незнаю правильно или нет 
RPattern[f,0,0]=DoubleToStr(CurTime(),0);
RPattern[f,1,0]=GetValue(60,1); //возвращает строку 
RPattern[f,1,1]=iPat; //iPat=""
}



for ( f=1; f <=arrsize; f++){//здесь пытаюсь сформировать строку с разделителями для вывода в лог.
fstring=RPattern[f,1,0];
cstring=cstring+fstring+"\n";
iPat=iPat+1;
}
WriteLineInFile("PATTERN2",cstring+iPat);  //вывожу в лог.
cstring="";fstring="";

for ( f=1; f <=arrsize; f++){  //здесь удаляю одинаковые значения из 2 измерения, возможно неправильно.
fstring=RPattern[f,1,0];
 for ( s=1; s <=arrsize; s++){
 cstring=RPattern[s,1,0];
 if(StringFind(cstring,fstring)>-1){RPattern[s,1,0]="";}
 }
} 
for ( f=1; f <=arrsize; f++){
if(RPattern[f,1,0]!=""){fstring=RPattern[f,1,0];cstring=cstring+fstring+"\n";unPat=unPat+1;} 
}
WriteLineInFile("PATTERNUn",cstring+unPat); //вывожу в лог содержимое массива без одинаковых значений.




вобщем выходит кака то странная ошибка, я с массивами еще не работал, если знакома проблема объясни пожалуйста че ему надо???

 
1. Нет смысла всерьёз смотреть код, кот. не доведен до варианта, пригодного к компиляции (отсутствие ошибок на этапе компилирования)

2. Беглый анализ показывает следующее:
string RPattern[500,1,1] - открыт массив с размерностью во втором индексе, равном 1.
RPattern[f,1,0] - попытка обращения к несуществующему элементу массива.
В первом случае 1 - это количество элементов по индексу.
Во втором случае 1 - это порядковый номер элемента по индексу.
Нумерация элементов индекса начинается с 0. Таким образом, 1 во втором индексе означает второй элемент по второму индексу (первый элемент имеет индекс 0, т.е. RPattern[f,0,0] .
Эта ошибка на этапе компиляции не обнаруживается.

3. (это не моё дело, конечно, но всё же имеет смысл писать код более организованно:
-использовать отступы для выделения вложенных блоков;
-использовать построчные комментарии и пр.)
 
вот текст советника в котором я пытаюсь обработать эти массивы, собственно я не могу понять как правильно заполнить массив мне нужно чтобы в 1 измерении была строка возвращаемая функцией
"GetValue()", а во 2 "DoubleToStr(CurTime(),0)" текущее время в виде строки, т.е. хотелось бы получить 500 строк в 1 изм. где для каждой из 500 строк во втором изм. записана строка с тек. временем а в 3 пока пустое значение.

при выполнении кода вот этого эксперта выскакивает вот такая ошибка:
2006.02.24 05:00:02 2001.10.01 08:00 TEMPLATEGSO EURJPY,H4: zero divide
что это за ошибка?
Спасибо.

//+------------------------------------------------------------------+
//|                           Copyright 2006, TemplateGSO            |
//|                                          lolion@mail.ru          |
//+------------------------------------------------------------------+

#property copyright "Copyright 2006, TemplateGSO "
#property link      "lolion@mail.ru"

#define MAGIC 916883
extern double lStopLoss      = 20;
extern double sStopLoss      = 20;
extern double lTakeProfit    = 50;
extern double sTakeProfit    = 50;
extern double lTrailingStop  = 20;
extern double sTrailingStop  = 15;
extern int Slippage = 5;
extern double Lots = 0.10;
extern string _Parameters_b_Lots = "Параметры модуля расчёта лота";
extern int LotsWayChoice  = 1;    // Способ выбора рабочего лота: 
                                  //  0-фиксированный, 
                                  //  1-процент от депозита, 
                                  //  2-фракционно-пропорциональный, 
                                  //  3-фракционно-фиксированный, 
extern int LotsPercent=40;   // Процент от депозита 
extern int LotsDeltaDepo=500;  // Коэффициент приращения депозита 
extern int LotsDepoForOne=500;  // Размер депозита для одного минилота 
extern int LotsMax=10000; // Максимальное количество минилотов 

extern color clOpenBuy = Blue;
extern color clCloseBuy = Aqua;
extern color clOpenSell = Red;
extern color clCloseSell = Violet;
extern color clModiBuy = Blue;
extern color clModiSell = Red;
extern string Name_Expert = "TemplateGSO";

int dDigits,unPat=0, iPat=0;
int f,s, arrsize;
string fstring, cstring;
string RPattern[100000,1,1],TPattern[0,0,0];

int init(){
dDigits=MarketInfo(Symbol(),MODE_DIGITS);
arrsize = ArraySize(RPattern);
}


void deinit() {
   Comment(""); 
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

int start(){

for (f=1; f<=Bars; f++){
RPattern[f,1,1] = GetValue(60,f);
RPattern[f,f,1] = DoubleToStr(CurTime(),0);
RPattern[f,f,f] = "";
}
arrsize = ArraySize(RPattern);
for(f=1; f<=50000; f++){
Print("1 "+RPattern[f,1,1]+" 2 "+RPattern[f,f,1]+" 3 "+RPattern[f,f,f]);Sleep(500);}

for ( f=1; f <=arrsize; f++){
fstring=RPattern[1,1,f];
cstring=cstring+fstring+"\n";
iPat=iPat+1;
}

WriteLineInFile("PATTERN2",cstring+iPat);
cstring="";fstring="";

for ( f=1; f <=arrsize; f++){
fstring=RPattern[1,1,f];
 for ( s=1; s <=arrsize; s++){
 cstring=RPattern[1,1,s];
 if(StringFind(cstring,fstring)>-1){RPattern[s,1,1]="";}
 }
} 
for ( f=1; f <=arrsize; f++){
if(RPattern[1,1,f]!=""){fstring=RPattern[f,1,1];cstring=cstring+fstring+"\n";unPat=unPat+1;} 
}
WriteLineInFile("PATTERNUn",cstring+unPat);

 
 if (!ExistPositions()){
 if (false){OpenBuy();}   
 if (false){OpenSell();}}    

 if (ExistPositions()){
 if(OrderType()==OP_BUY){
 if (false){CloseBuy();}} 
 if(OrderType()==OP_SELL){ 
 if (false){CloseSell();}} 
 if (lTrailingStop>0||sTrailingStop>0){TrailingPositionsBuy(lTrailingStop);TrailingPositionsSell(sTrailingStop);}}
 return (0);}

string GetValue(int TF, int Shift){
string Pat;
double IMacdHist, IMacdSign, Ima, Isar, Ifatl, IStochMain, IstochSignl;
double PivotR2, PivotR1, PivotC, PivotS1, PivotS2;
IMacdHist   = NormalizeDouble(iMACD(NULL,TF,10,16,7,PRICE_TYPICAL,MODE_MAIN,Shift),dDigits+1);
IMacdSign   = NormalizeDouble(iMACD(NULL,TF,10,16,7,PRICE_TYPICAL,MODE_SIGNAL,Shift),dDigits+1);
Ima         = NormalizeDouble(iMA(NULL,TF,7,0,MODE_EMA,PRICE_TYPICAL,Shift),dDigits)/NormalizeDouble(iMA(NULL,TF,14,0,MODE_EMA,PRICE_TYPICAL,Shift),dDigits);
Isar        = NormalizeDouble(iClose(NULL,TF,Shift),dDigits)/NormalizeDouble(iSAR(NULL,TF,0.005,0.2,Shift),dDigits);
IStochMain  = NormalizeDouble(iStochastic(NULL,TF,5,3,3,MODE_EMA,1,MODE_MAIN,Shift),4);
IstochSignl = NormalizeDouble(iStochastic(NULL,TF,5,3,3,MODE_EMA,1,MODE_SIGNAL,Shift),4);
PivotR2 = NormalizeDouble(iClose(NULL,TF,Shift),dDigits)/NormalizeDouble(iCustom(NULL,TF,"^Pivot_ResSup2",0,0,Shift),dDigits);
PivotR1 = NormalizeDouble(iClose(NULL,TF,Shift),dDigits)/NormalizeDouble(iCustom(NULL,TF,"^Pivot_ResSup",0,0,Shift),dDigits);
PivotC  = NormalizeDouble(iClose(NULL,TF,Shift),dDigits)/NormalizeDouble(iCustom(NULL,TF,"^Pivot_PP_Full",0,0,Shift),dDigits);
PivotS1 = NormalizeDouble(iClose(NULL,TF,Shift),dDigits)/NormalizeDouble(iCustom(NULL,TF,"^Pivot_ResSup",0,1,Shift),dDigits);
PivotS2 = NormalizeDouble(iClose(NULL,TF,Shift),dDigits)/NormalizeDouble(iCustom(NULL,TF,"^Pivot_ResSup2",0,1,Shift),dDigits);
Pat=StringConcatenate(IMacdHist,"|",IMacdSign,"|",Ima,"|",Isar);
return(Pat);
//if(PrevPat!=Pat){unPat=unPat+1; PrevPat=Pat; WriteLineInFile("PATTERN",Pat+"|"+CurTime());}
//WriteLineInFile("PATTERN2",Pat+"|"+CurTime());
//iPat=iPat+1;

}







//+----------------------------------------------------------------------------+
//| Функция записи строки в файл протокола                          function///| 
//+----------------------------------------------------------------------------+ 
void WriteLineInFile(string FileName,string Line){//1
int LastError = 0;
   int HFile=FileOpen(FileName,FILE_READ|FILE_WRITE," "); 
   if(HFile>0) 
   {//2    
      FileSeek(HFile,0,SEEK_END); 
      FileWrite(HFile,Line); 
      FileFlush(HFile); 
      FileClose(HFile); 
   }else{Print("There is an error with opening file "+GetLastError());}
}//1 
//+----------------------------------------------------------------------------+ 
//| Конец функции записи строки в файл протокола                    function///| 
//+----------------------------------------------------------------------------+ 

bool ExistPositions() {
	for (int i=0; i<OrdersTotal(); i++) {
		if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
			if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) {
				return(True);
			}
		} 
	} 
	return(false);
}
void TrailingPositionsBuy(int trailingStop) { 
   for (int i=0; i<OrdersTotal(); i++) { 
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { 
         if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) { 
            if (OrderType()==OP_BUY) { 
               if (Bid-OrderOpenPrice()>trailingStop*Point) { 
                  if (OrderStopLoss()<Bid-trailingStop*Point) 
                     ModifyStopLoss(Bid-trailingStop*Point); 
               } 
            } 
         } 
      } 
   } 
} 
void TrailingPositionsSell(int trailingStop) { 
   for (int i=0; i<OrdersTotal(); i++) { 
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { 
         if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC) { 
            if (OrderType()==OP_SELL) { 
               if (OrderOpenPrice()-Ask>trailingStop*Point) { 
                  if (OrderStopLoss()>Ask+trailingStop*Point || OrderStopLoss()==0)  
                     ModifyStopLoss(Ask+trailingStop*Point); 
               } 
            } 
         } 
      } 
   } 
} 
void ModifyStopLoss(double ldStopLoss) { 
   bool fm;
   fm = OrderModify(OrderTicket(),OrderOpenPrice(),ldStopLoss,OrderTakeProfit(),0,CLR_NONE); 
} 

void CloseBuy() { 
   bool fc; 
   fc=OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, clCloseBuy); 
} 
void CloseSell() { 
   bool fc; 
   fc=OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell); 
} 
void OpenBuy() { 
   double ldLot, ldStop, ldTake; 
   string lsComm; 
   ldLot = GetSizeLot(); 
   ldStop = GetStopLossBuy(); 
   ldTake = GetTakeProfitBuy(); 
   lsComm = GetCommentForOrder(); 
   OrderSend(Symbol(),OP_BUY,ldLot,Ask,Slippage,ldStop,ldTake,lsComm,MAGIC,0,clOpenBuy); 
} 
void OpenSell() { 
   double ldLot, ldStop, ldTake; 
   string lsComm; 

   ldLot = GetSizeLot(); 
   ldStop = GetStopLossSell(); 
   ldTake = GetTakeProfitSell(); 
   lsComm = GetCommentForOrder(); 
   OrderSend(Symbol(),OP_SELL,ldLot,Bid,Slippage,ldStop,ldTake,lsComm,MAGIC,0,clOpenSell); 
} 
string GetCommentForOrder() { 	return(Name_Expert); } 

double GetSizeLot() { 
  double dLot; 
  if (LotsWayChoice==0) dLot=Lots; 
    Print("0    ",dLot); 
  // фиксированный процент от депозита 
  if (LotsWayChoice==1) { 
    dLot=MathCeil(AccountFreeMargin()/10000*LotsPercent)/10;
    Print("1    ",dLot); 
  } 

  // фракционно-пропорциональный 
  if (LotsWayChoice==2) {   
    int k=LotsDepoForOne; 
    for (double i=2; i<=LotsMax; i++) { 
      k=k+i*LotsDeltaDepo; 
      if (k>AccountFreeMargin()) { 
        dLot=(i-1)/10; break; 
      } 
    }
    Print("2    ",dLot); 
  } 

  // фракционно-фиксированный 
  if (LotsWayChoice==3) {
   
    dLot=MathCeil((AccountFreeMargin()-LotsDepoForOne)/LotsDeltaDepo)/10; 
      Print("3    ",dLot); 

  } 

  if (dLot<0.1)  dLot=0.1;
  if (dLot>LotsMax) dLot=LotsMax;
   
  return(NormalizeDouble(dLot,1));  
  } 

double GetStopLossBuy(){
 if (lStopLoss>0){
 return (Bid-(lStopLoss*Point));
 }
 if (lStopLoss == 0){
 return (0);
 }
}
 
double GetStopLossSell(){
 if (sStopLoss>0){ 	
 return(Ask+(sStopLoss*Point)); 
 } 
 if (sStopLoss == 0){
 return (0);
 }
}

double GetTakeProfitBuy(){
 if (lTakeProfit>0){ 	
 return(Ask+(lTakeProfit*Point)); 
 } 
 if (lTakeProfit == 0){ 	
 return(0); 
 } 
} 

double GetTakeProfitSell(){
 if (sTakeProfit>0){ 	 	
 return(Bid-(sTakeProfit*Point)); 
 }
 if (sTakeProfit == 0){ 	
 return(0); 
 } 
} 
 
Могу только сказать то же самое.

1. Привести код в порядок (отступы и комментарий). У каждого свой стиль, конечно. Но оч. трудно воспрнимать чужой код, есл не понятно что имел ввиду автор.

2. Или я чего-то не понимаю или всё же это явная ошибка.
Определён массив:
string RPattern[100000,1,1]


Размерность масива по второму индексу - единица.
Обращение к массиву в цикле:

for (f=1; f<=Bars; f++){
RPattern[f,1,1] = GetValue(60,f);
RPattern[f,f,1] = DoubleToStr(CurTime(),0);
RPattern[f,f,f] = "";
}


Что имеется ввиду в строках:

RPattern[f,f,1] = DoubleToStr(CurTime(),0);
RPattern[f,f,f] = "";


Bars, а сответственно и f может принимать значения больше единицы.
Массив так определён, что в нём не предусмотрены такие ячейки.

Естественно, что во время исполнения программы, при попытке обращения к несуществующей ячейке массива система будет квалифицировать это действие как ошибочное, о чём будет сообщено в письменном виде в лог-файл. Теперь помножь второй индекс на третий (по колич. баров) и посчитай сколько будет записей в логе об ошибочных обращениях.

Дальше анализировать код нет смысла.

Причина обращения: